在javascript

时间:2016-06-12 11:53:37

标签: javascript filter functional-programming ecmascript-6

我有一个对象数组。数组中的每个对象都有一个数组。我想过滤数组,父数组和嵌套数组。例如,我有一个像:

这样的数组
[{list:[1,2]},{list:[1,2,3]},{list:[1,2,3,4]}]

当我应用filter时,它返回其中包含值大于2的列表元素的对象,并且也会过滤嵌套列表本身。它应该返回

[{list:[3]},{list:[3,4]}]

不返回Obj1,因为其中的列表没有任何大于2的值,仅对于Obj2列表:[3]返回,仅对于Obj3列表:[3,4]返回

是否有可能在不改变原始列表的情况下实现?

以下代码过滤具有大于2

的元素的对象
parent
  .filter(obj => obj.list.some(el => el > 2))

接下来我该怎么办? 如果我为嵌套数组应用过滤器,如

...
  .filter(obj => obj.list.filter(el => el > 2))

然后我得到[[3],[3,4]]但不反对自己。也许有人知道解决方案吗?

2 个答案:

答案 0 :(得分:5)

我想我会过滤子列表,然后检查它的长度:

var parent = [{list:[1,2]},{list:[1,2,3]},{list:[1,2,3,4]}];

parent = parent
  .filter(obj => {
    obj.list = obj.list.filter(el => el > 2);
    return obj.list.length > 0; // Technically just `return obj.list.length;` would work; I prefer the clarity of the comparison
  });
console.log(parent);

是的,上述内容可以更简洁地完成;我认为清晰度受到影响,但这是一个判断力:

var parent = [{list:[1,2]},{list:[1,2,3]},{list:[1,2,3,4]}];

parent = parent.filter(obj => (obj.list = obj.list.filter(el => el > 2)).length);
console.log(parent);

答案 1 :(得分:0)

除了TJ Crowder的答案之外,我还想提一下你仍然会有变异的原始列表项。

最好将初始数组映射到具有已过滤的list属性的新项目,然后过滤空列表。

const parent = [{list:[1,2]},{list:[1,2,3]},{list:[1,2,3,4]}];

const filtered = parent
    // filter nested lists first
    .map(obj => {
         // here we can use Object.assign to make shallow copy of obj, to preserve previous instance unchanged
         return Object.assign({}, obj, {
             list: obj.list.filter(el => el > 2)
         })
    })
    // then omit all items with empty list
    .filter(obj => obj.list.length > 0)
console.log(filtered);