const data = { "cars": [ { "name": "Audi", "color": "blue" }, { "name": "Saab", "color": "red" }, { "year": 2007, "owner": "NaN" } ], "boats": { "fish": [ { "name": "Salmon", "safe": true } ], "sharks": { "name": "Great White" } }, "trucks": { "vans": { "bikes": [1, 2, 3] } } }; function findProperty(obj: any, property: string): any { let result:any = {}; for(const prop in obj) { if(Object.prototype.toString.call(obj[prop]) === "[object Object]" && !obj[prop].hasOwnProperty(property)) return findProperty(obj[prop], property); for(const i in obj[prop]) { if(obj[prop][i].hasOwnProperty(property)) { if(result.hasOwnProperty(prop)) { result[prop].push(obj[prop][i]); } else { Object.assign(result, { [prop]: [obj[prop][i]] }); } } } } return result; };
I’m trying to find all arrays with objects that contain the property name
no matter how nested the initial data object is; and for some reason the final result only contains 1 result instead of all of them.
When I debug at line 45 with
console.log(obj[prop][i])
I can see that it finds all objects; all 3 of them, yet only one of them is present in the final result.
What am I missing here?
Advertisement
Answer
You keep making a new result object so you probably want to create it once and pass it along
function findProperty(obj: any, property: string, result: any = {}): any { for(const prop in obj) { if(Object.prototype.toString.call(obj[prop]) === "[object Object]" && !obj[prop].hasOwnProperty(property)) return findProperty(obj[prop], property, result); for(const i in obj[prop]) { if(obj[prop][i].hasOwnProperty(property)) { console.log(obj[prop][i]); if(result.hasOwnProperty(prop)) { result[prop].push(obj[prop][i]); } else { Object.assign(result, { [prop]: [obj[prop][i]] }); } } } } console.log("result:", result); return result; };