Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

การดึงคีย์อ็อบเจ็กต์โดยใช้การเรียกซ้ำใน JavaScript


เรามีอ็อบเจ็กต์ที่มีอ็อบเจกต์อื่นเป็นค่าคุณสมบัติของมัน มันซ้อนกันถึง 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'));

ในฟังก์ชันนี้ ก่อนอื่นเราวนซ้ำบนออบเจ็กต์หลัก และเมื่อใดก็ตามที่เราพบการซ้อน เราจะวนซ้ำในการค้นหาออบเจ็กต์ย่อยเพื่อค้นหาคีย์ที่ต้องการ หากเราพบคีย์ที่ต้องการ เราจะบันทึกค่าของคีย์นั้นในอาร์เรย์ผลลัพธ์ทันที และที่ สุดท้ายเมื่อเราวนซ้ำเสร็จ เราจะคืนค่าอาร์เรย์ผลลัพธ์ที่มีค่าที่ต้องการ

ความซับซ้อนของเวลาของฟังก์ชันนี้คือ O(mn) โดยที่จำนวนออบเจ็กต์ย่อยภายในออบเจ็กต์หลัก และ m คือระดับการซ้อนที่ลึกที่สุด

ผลลัพธ์ในคอนโซลสำหรับรหัสนี้จะเป็น −

[ 31, 22, 26 ]