สมมติว่าเราต้องเขียนฟังก์ชัน isSame() ที่รับอ็อบเจกต์ซ้อนและคืนค่า boolean ตามข้อเท็จจริงว่าทุก key มีค่าเท่ากันหรือไม่ โดย "ทุก key" หมายถึง key สุดท้ายทั้งหมด เช่น ถ้า key ไหนมีอ็อบเจกต์ซ้อนเป็นค่า เราต้อง traverse จนถึงท้ายของอ็อบเจกต์ซ้อนและตรวจสอบค่านั้น
ตัวอย่างเช่น - ถ้าอ็อบเจกต์คือ:
const obj = {
a: 1,
b: 1,
c: {
aa: 1
}
};
ฟังก์ชันควรคืน true เพราะ key สุดท้ายทั้งหมดมีค่าเท่ากัน (1) มาเขียนโซลูชันแบบ recursive สำหรับปัญหานี้กัน:
ตัวอย่างโค้ด
const obj = {
a: 1,
b: 1,
c: {
aa: 3
}
};
const allSame = (obj, value) => {
const keys = Object.keys(obj);
for (let i = 0; i < keys.length; i++) {
if (typeof obj[keys[i]] === "object" && !Array.isArray(obj[keys[i]])) {
return allSame(obj[keys[i]], value);
}
if (!value) {
value = obj[keys[i]];
continue;
}
if (obj[keys[i]] !== value) {
return false;
}
}
return true;
};
console.log(allSame(obj));
console.log(allSame({ a: 1, b: 1, c: { aa: 1 } }));
console.log(allSame({ a: { x: 1 }, b: 1, c: { aa: 1 } }));
console.log(allSame({ a: 1, b: 1, c: { aa: 2 } }));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็นดังนี้:
false true true false