สมมติว่าเรามีวัตถุ 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' } ]