Giả sử chúng ta có đối tượng JSON lồng nhau sau -
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' } ] };
Chúng tôi được yêu cầu viết một hàm JavaScript lấy một đối tượng như đối số đầu tiên, một chuỗi khóa làm đối số thứ hai và một chuỗi giá trị làm đối số thứ ba. Sau đó, hàm sẽ kiểm tra cặp giá trị khóa đã cho trong đối tượng JSON.
Nếu tồn tại bất kỳ đối tượng nào thì hàm sẽ trả về một mảng gồm tất cả các đối tượng đó.
Chúng tôi sẽ sử dụng phương pháp sau để giải quyết vấn đề này -
- nếu mục được tìm kiếm là sai hoặc nếu nó không phải là một đối tượng, thì chúng tôi sẽ trả lại
- nếu khóa và giá trị đã cho khớp, thì chúng tôi sẽ thêm đối tượng thực tế vào tập kết quả,
- chúng tôi nhận các khóa và lặp lại các thuộc tính và gọi lại hàm.
Cuối cùng, chúng tôi trả về mảng với các đối tượng đã thu thập.
Ví dụ
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));
Đầu ra
[ { 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' } ]