按特性名称搜索嵌套对象并复制到新对象不会导致复制所有对象



链接到TS游乐场。

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;
};

无论初始数据对象是如何嵌套的,我都试图找到所有具有包含属性name的对象的数组;并且由于某种原因,最终结果仅包含1个结果而不是全部结果。

当我用在第45行调试时

console.log(obj[prop][i])

我可以看到它找到了所有的物体;他们三个人,但只有一个人出现在最终结果中。

我在这里错过了什么?

您一直在创建一个新的结果对象,所以您可能想创建一次并将其传递给

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;
};

最新更新