Javascript 搜索筛选器嵌套数组在对象之后获取修改的原始数组。分配
尝试基于数字在2级嵌套数组上实现搜索筛选器:如果数字/数字与我的数据结构中的任何序列匹配,则结果需要与搜索条件完全匹配: 我的数据结构:原始数组Javascript 搜索筛选器嵌套数组在对象之后获取修改的原始数组。分配,javascript,arrays,angular,ecmascript-6,Javascript,Arrays,Angular,Ecmascript 6,尝试基于数字在2级嵌套数组上实现搜索筛选器:如果数字/数字与我的数据结构中的任何序列匹配,则结果需要与搜索条件完全匹配: 我的数据结构:原始数组 TreeRange: { tree: '17200', treeRanges: [ { id: 134055, strttreeNum: '5308550000000000000', endngtreeNum: '5308
TreeRange:
{
tree: '17200',
treeRanges: [
{
id: 134055,
strttreeNum: '5308550000000000000',
endngtreeNum: '5308559999999999999',
treeregistered [
{
id: 9,
branch: '12345678989895559'
},
{
id: 10,
branch: '78912349494945449'
}
]
},
{
id: '23175',
strttreeNum: '1234309999999999999',
endngtreeNum: '3466309999999999999',
treeregistered: [
{
id: 14,
branch: '5500001231234234'
},
{
id: 15,
branch: '5598761234444234'
}
]
}
]
}
当前输出:SearchFilterArray:
{
id: '23175',
strttreeNum: '1234309999999999999',
endngtreeNum: '3466309999999999999',
treeregistered: [
{
id: 14,
branch: '5500001234444234'//only show this in search result
},
{
id: 15,
branch: '5598761230000234' //**Not suppose show this record**
}
]
}
预期输出:SearchFilterArray:
按搜索词搜索:4444
TreeRange:
{
tree: '17200',
treeRanges: [
{
id: '23175',
strttreeNum: '1234309999999999999',
endngtreeNum: '3466309999999999999',
treeregistered: [
{
id: 15,
branch: '5598761234444234'
}
]
}
]
}
当我清除搜索时,需要将原始嵌套的treeregistered数组重置为上面显示的原始数组。
代码:
}
当我搜索树状图并返回过滤结果时,它会起作用,但树状图注册的数组没有按照searchTerm进行过滤,我在下面添加了另一个过滤器:问题是当我进行搜索时,我的原始树状图注册的嵌套数组被修改,当我清除搜索时,我没有可用的原始数组。
object.assign适用于treeRanges嵌套数组,但不适用于treeregistered嵌套数组
filterArray = filterArray.map(filterTreeRange => {
filterTreeRange.treeRanges = filterTreeRange.treeRanges.filter(filTreeRange => {
filTreeRange.treeregistered = filTreeRange.treeregistered.filter(
treReg =>
treReg.branch.includes(searchTerm) ||
filTreeRange.strttreeNum.includes(searchTerm) ||
filTreeRange.strttreeNum.includes(searchTerm) ||
filterTreeRange.tree.includes(searchTerm))
return filTreeRange;
});
我尝试过对象方法、过滤器和映射。我知道我需要另一张地图,但我不确定如何进行深度复制,我正在进行浅层复制,看起来缺少了一点小东西。您的问题在于以下几行:
filterTreeRange.treeRanges = filterTreeRange.treeRanges.filter(...);
及
您正在修改树名和树注册属性,而不是返回修改后的副本。执行Object.assign以覆盖这些属性,同时保持其他属性不变
请注意,Object.assign只进行浅层复制,因此您最终修改了原始对象
下面是一个完整的演示:
常数数据=[{
树:17200,
树冠:[
{
身份证号码:134055,
strtreenum:5308550000000000000,
endngtreeNum:530855999999999,
树木注册:[
{
id:9,
分行:123456789559
},
{
id:10,
分行:7891234949445449
}
]
},
{
身份证号码:23175,
strtreenum:123430999999999,
endngtreeNum:3466309999999999,
树木注册:[
{
身份证号码:14,
分行:5500001234234
},
{
身份证号码:15,
分行:5598761234444234
}
]
}
]
}];
const treeRegisteredIncludes=searchTerm=>treereg=>treereg.branch.includesearchterm
常量TreeRanges=searchTerm=>treeinRange=>
treeinRange.strttreeNum.includessearchTerm||
treeinRange.endngtreeNum.includessearchTerm||
treeinRange.treeregistered.sometreeRegisteredIncludessearchTerm
const itemIncludes=searchTerm=>item=>
item.tree.includessearchTerm||
item.treeRanges.SomeTreeRanges包括
常量filterByTerm=treeRange,searchTerm=>!搜索词?树语:
treeRange.filteritemIncludessearchTerm
.mapfilterTreeRange=>
Object.assign{},filterTreeRange{
treeRanges:filterTreeRange.treeRanges
.过滤器范围包括搜索项
.mapfilTreeRange=>
Object.assign{},filTreeRange{
treeregistered:filTreeRange.treeregistered.filtertreeRegisteredIncludessearchTerm
}
}
;
console.log{
filteredBySearchTerm:filterByTermdata,444,
原件:数据
};您说您没有可用的原始阵列。你能先用Object.assign获取它的深层副本吗?我在搜索过滤器之前做Object.assign让filteraray=treeRange.mapaRanges=>Object.assign{},aRanges;treeRanges没有被修改,当我清除searchTerm时它正在重置,但问题是treeregistered数组没有重置,object.assign对内部嵌套的treeregistered ArrayTried对象不起作用。在应用此搜索逻辑之前,对父数组进行赋值:让filterArray=treeRange.mapaRanges=>object.assign{},阿兰奇;但它在嵌套数组treeregistered上不起作用。经验法则是避免对子对象的属性进行赋值,因为即使您对外部结构进行了浅层复制,也确实会使内部对象发生变异。感谢@Tiago Coelho,他工作得非常出色,在您的解释和实现中很好地理解了对象方法。
filterTreeRange.treeRanges = filterTreeRange.treeRanges.filter(...);
filTreeRange.treeregistered = filTreeRange.treeregistered.filter(...);