3 回答
TA贡献1816条经验 获得超6个赞
因为您已经深度复制了未嵌套的父数据数组,所以您可以尝试以下方式 -
this.filteredObject = [...this.groups];
this.filteredObject.map(item => {
let tempLang = [...item.languages];
item.languages = tempLang.filter(lg =>
lg.Name.toLocaleLowerCase().indexOf(searchQuery) != -1 ||
lg.Code.toLocaleLowerCase().indexOf(searchQuery) != -1
);
});
TA贡献1776条经验 获得超12个赞
Spread 语法执行对象的浅拷贝。
关于使用扩展语法复制数组的MDN 文档:
在复制数组时,Spread 语法有效地深入一层。因此,它可能不适合复制多维数组,如下例所示(与 Object.assign() 和 spread 语法相同)。
这意味着如果顶层有任何对象,它们的引用将被复制。这就是这个问题的原因。
您可以使用 JSON.parse(JSON.stringify())深度克隆对象。但会有数据丢失如果对象DateS,功能undefined,Infinity或其他复杂的类型。此答案中的更多信息。
此外,当你不返回任何值使用forEach(),而不是一个map()。
this.filteredObject = JSON.parse(JSON.stringify(this.groups));
filteredObject.forEach(item => {
item.languages = item.languages.filter(lg =>
lg.Name.toLocaleLowerCase().indexOf(searchQuery.toLocaleLowerCase()) != -1 ||
lg.Code.toLocaleLowerCase().indexOf(searchQuery.toLocaleLowerCase()) != -1
);
});
这适用于包含任何嵌套级别的对象的属性。
现场示例:
let data = [ { "name": "Automation", "languages": [ { "Name": "English", "Lcid": 1, "RightToLeft": true, "Code": "EN", "Mapped": true } ] }, { "name": "Monitors", "languages": [ { "Name": "Russian", "Lcid": 2, "RightToLeft": true, "Code": "RU", "Mapped": true } ] } ];
let searchQuery = "English";
let filteredObject = JSON.parse(JSON.stringify(data));
filteredObject.forEach(item => {
item.languages = item.languages.filter(lg =>
lg.Name.toLocaleLowerCase().indexOf(searchQuery.toLocaleLowerCase()) != -1 ||
lg.Code.toLocaleLowerCase().indexOf(searchQuery.toLocaleLowerCase()) != -1
);
});
console.log(data);
console.log(filteredObject);
添加回答
举报