สมมุติว่าเรามีอ็อบเจ็กต์ที่มีอ็อบเจกต์อื่นเป็นค่าคุณสมบัติของมัน มันซ้อนกัน 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
}
}
} งานของเราคือการเขียนฟังก์ชันที่ยอมรับวัตถุนี้และสตริง ค้นหาวัตถุทั้งหมดสำหรับสตริงนั้นเป็นคีย์ และส่งกลับอาร์เรย์ที่มีค่าของคีย์ทั้งหมดที่ตรงกับสตริงนั้น
เรามาเรียกฟังก์ชัน recursiveSearch() กันดีกว่า การเรียกซ้ำจะเป็นวิธีที่เหมาะสมที่สุดในการจัดการกับสถานการณ์นี้ เมื่อพิจารณาจากการทำรัง
ดังนั้นโค้ดแบบเต็มสำหรับฟังก์ชันนี้ 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 ]
ในฟังก์ชันข้างต้น ก่อนอื่นเราวนซ้ำบนออบเจ็กต์หลัก และเมื่อใดก็ตามที่เราพบ anesting เราจะวนซ้ำในการค้นหาออบเจกต์ย่อยเพื่อค้นหาคีย์ที่ต้องการ หากเราพบคีย์ที่ต้องการ เราจะบันทึกค่าของคีย์นั้นในอาร์เรย์ผลลัพธ์ทันทีและที่ สุดท้ายเมื่อเราเสร็จสิ้น เราจะส่งคืนอาร์เรย์ผลลัพธ์ที่มีค่าที่ต้องการ
ความซับซ้อนของเวลาของฟังก์ชันนี้คือ O(mn) โดยที่จำนวนออบเจ็กต์ย่อยภายในออบเจ็กต์หลัก และ m คือระดับการซ้อนที่ลึกที่สุด