【问题标题】:Filter array in array of objects in javascript在javascript中的对象数组中过滤数组
【发布时间】:2016-10-12 22:30:25
【问题描述】:

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

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

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

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

不返回Obj1,因为它里面的list没有任何大于2的值,对于Obj2只返回list:[3],对于Obj3只返回list:[3,4]

不改变原始列表是否可以实现?

以下代码过滤元素大于 2 的对象

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

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

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

然后我得到[[3],[3,4]] 但不是对象本身。也许有人知道解决方案?

【问题讨论】:

    标签: javascript filter functional-programming ecmascript-6


    【解决方案1】:

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

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

    【讨论】:

    • 技术上我们不应该用 let 代替 var 吗?
    • @Thalaivar:技术上?不,两者在 ES2015 中都完全有效。 :-)(不过,当我在考虑 ES2015 时,我确实倾向于使用 let 而不是 var;在上面,这与其他任何事情一样都是风格问题。)
    【解决方案2】:

    除了 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);

    【讨论】:

      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多