Javascript过滤两个数组

时间:2017-04-10 14:29:32

标签: javascript arrays

所以我需要在这个数组中过滤数组和数组。

所以,我们有一个数组 -

arr: [
   {
      name: 'object',
      array2: [
         {
            name: '1'
         },
         {
            name: '2'
         }
      ]
   },
   {
      name: 'object 2',
      array2: [
         {
            name: 'object'
         }
      ]
   }
]

我在过滤器中输入值2,我想要的输出是 -

arr: [
   {
      name: 'object',
      array2: [
         {
            name: '2'
         }
      ]
   },
   {
      name: 'object 2',
      array2: []
   }
]

我在这里有匹配的逻辑,它适用于外层(第一层,我有一个带有name和array2参数的对象)。内层也有效,但问题在于,如果我过滤内层,我就无法恢复内部对象的初始状态,即。我有一个输入栏,如果我输入2,它被过滤得很好,但是,如果我删除2,那么它显示来自arr:[]的其他元素,但是没有显示来自array2的过滤元素: []。

有关如何解决此问题的任何想法?

使用评论链接到jsFiddle - http://jsbin.com/pupugoxebi/edit?html,js,output

我手动推入新阵列,但这不起作用,因为我有动态数组,例如,它可以有不同的属性,手动编写不会解决它。更新版本 - http://jsbin.com/bifolisefu/edit?html,js,output

2 个答案:

答案 0 :(得分:1)

你可以使用ceck作为外部数组的名称,或者检查内部数组是否返回一些项目,然后构建一个新对象并将其连接到结果集。



function getNodes(array, name) {
    return array.reduce(function (r, a) {
        var temp = a.array2.filter(b => b.name.includes(name));
        return r.concat(
            a.name.includes(name) || temp.length ?
            Object.assign({}, a,  { array2: temp }) :
            []
        );
    }, []);
}

var array = [{ name: 'test', foo: 0, array2: [{ name: 'test 2', foo: 1 }, { name: 'test 3', foo: 2 }] }, { name: 'test 2', foo: 3, array2: [{ name: 'test', foo: 4 }] }, { name: 'test 3', foo: 5, array2: [{ name: 'test 4', foo: 6 }, { name: 'test 5', foo: 7 }] }];

console.log(getNodes(array, '2'));
console.log(getNodes(array, '3'));
console.log(array);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:0)

尝试以下代码。

var arr2 = [
  {
    name: 'test',
    array2: [
      {
        name: 'test 2'
      },
      {
        name: 'test 3'
      }
    ]
  },
  {
    name: 'test 2',
    array2: [
      {
        name: 'test'
      }
    ]
  },
  {
    name: 'test 3',
    array2: [
      {
        name: 'test 4'
      },
      {
        name: 'test 5'
      }
    ]
  }
];

arr2.map(e => {
  var tmp = e.array2.filter(e2 => e2.name.includes('2'));
  e.array2 = tmp;
});

console.log(arr2);