สมมติว่าเรามีวัตถุ JSON ที่ซ้อนกันดังต่อไปนี้ -
const obj = {
id: 1,
title: 'hello world',
child: {
id: null,
title: 'foobar',
child: {
id: null,
title: 'i should be in results array '
}
},
foo: {
id: null,
title: 'i should be in results array too!' },
deep: [
{
id: null,
value: 'yo'
}, {
id: null,
value: 'yo2'
}
]
}; เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับวัตถุเช่นอาร์กิวเมนต์แรก สตริงคีย์เป็นอาร์กิวเมนต์ที่สอง และสตริงค่าเป็นอาร์กิวเมนต์ที่สาม ฟังก์ชันควรตรวจสอบคู่ของค่าคีย์ที่ระบุในออบเจ็กต์ JSON
หากมีอ็อบเจกต์ใดๆ อยู่ ฟังก์ชันควรส่งคืนอาร์เรย์ของอ็อบเจ็กต์ดังกล่าวทั้งหมด
เราจะใช้แนวทางต่อไปนี้เพื่อแก้ปัญหานี้ -
- หากรายการที่ค้นหาเป็นเท็จหรือไม่ใช่วัตถุ เราจะส่งคืน
- หากให้คีย์และค่าตรงกัน เราจะเพิ่มออบเจกต์จริงไปยังชุดผลลัพธ์
- เราได้รับคีย์และวนซ้ำคุณสมบัติและเรียกใช้ฟังก์ชันอีกครั้ง
ในที่สุด เราก็ส่งคืนอาร์เรย์ด้วยวัตถุที่รวบรวมไว้
ตัวอย่าง
const obj = {
id: 1,
title: 'hello world',
child: {
id: null,
title: 'foobar',
child: {
id: null,
title: 'i should be in results array '
}
},
foo: {
id: null,
title: 'i should be in results array too!' },
deep: [
{
id: null, value: 'yo'
}, {
id: null, value: 'yo2'
}
]
};
const findObject = (obj = {}, key, value) => {
const result = [];
const recursiveSearch = (obj = {}) => {
if (!obj || typeof obj !== 'object') { return;
};
if (obj[key] === value){
result.push(obj);
};
Object.keys(obj).forEach(function (k) {
recursiveSearch(obj[k]);
});
} recursiveSearch(obj);
return result;
} console.log(findObject(obj, 'id', null)); ผลลัพธ์
[
{
id: null,
title: 'foobar',
child: {
id: null, title: 'i should be in results array '
}
},
{
id: null, title: 'i should be in results array '
}, {
id: null, title: 'i should be in results array too!'
}, {
id: null, value: 'yo'
}, { id: null, value: 'yo2'
}
]