Javascript 搜索筛选器嵌套数组在对象之后获取修改的原始数组。分配

Javascript 搜索筛选器嵌套数组在对象之后获取修改的原始数组。分配,javascript,arrays,angular,ecmascript-6,Javascript,Arrays,Angular,Ecmascript 6,尝试基于数字在2级嵌套数组上实现搜索筛选器:如果数字/数字与我的数据结构中的任何序列匹配,则结果需要与搜索条件完全匹配: 我的数据结构:原始数组 TreeRange: { tree: '17200', treeRanges: [ { id: 134055, strttreeNum: '5308550000000000000', endngtreeNum: '5308

尝试基于数字在2级嵌套数组上实现搜索筛选器:如果数字/数字与我的数据结构中的任何序列匹配,则结果需要与搜索条件完全匹配:

我的数据结构:原始数组

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(...);