สมมติว่าเรามีอ็อบเจกต์ที่มีอ็อบเจกต์อื่นเป็นค่าคุณสมบัติ ซ้อนกัน 2-3 ระดับ หรือมากกว่า
อ็อบเจกต์ตัวอย่าง
const people = {
Ram: {
fullName: 'Ram Kumar',
details: {
age: 31,
isEmployed: true
}
},
Sourav: {
fullName: 'Sourav Singh',
details: {
age: 22,
isEmployed: false
}
},
Jay: {
fullName: 'Jay Grewal',
details: {
age: 26,
isEmployed: true
}
}
}
หน้าที่คือเขียนฟังก์ชันรับอ็อบเจกต์นี้และสตริง ค้นหาทั่วอ็อบเจกต์หา key ที่ตรงกับสตริง คืนอาร์เรย์ที่มีค่าของ key ที่ตรงกันทั้งหมด
เรียกฟังก์ชันว่า recursiveSearch() Recursion เหมาะสมที่สุดสำหรับการซ้อนนี้
โค้ดเต็มของฟังก์ชัน recursiveSearch()
ตัวอย่าง
const people = {
Ram: {
fullName: 'Ram Kumar',
details: {
age: 31,
isEmployed: true
}
},
Sourav: {
fullName: 'Sourav Singh',
details: {
age: 22,
isEmployed: false
}
},
Jay: {
fullName: 'Jay Grewal',
details: {
age: 26,
isEmployed: true
}
}
}
const recursiveSearch = (obj, searchKey, results = []) => {
const r = results;
Object.keys(obj).forEach(key => {
const value = obj[key];
if(key === searchKey && typeof value !== 'object'){
r.push(value);
}else if(typeof value === 'object'){
recursiveSearch(value, searchKey, r);
}
});
return r;
};
console.log(recursiveSearch(people, 'age'));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น
[ 31, 22, 26 ]
ในฟังก์ชันข้างต้น เราวนลูปผ่านอ็อบเจกต์หลัก และเมื่อเจอการซ้อน เรา recursive วนลูปผ่านซับอ็อบเจกต์ ค้นหา key ที่ต้องการ หากเจอ key ที่ต้องการ จะบันทึกค่าของมันทันทีในอาร์เรย์ results และเมื่อวนลูปเสร็จ จะคืนอาร์เรย์ results ที่มีค่าที่ต้องการ
ความซับซ้อนด้านเวลาของฟังก์ชันนี้คือ O(mn) โดย m คือจำนวนอ็อบเจกต์ลูกภายในอ็อบเจกต์หลัก และ n คือระดับการซ้อนที่ลึกที่สุด