我有一个对象数组。数组中的每个对象都有一个数组。我想过滤数组,父数组和嵌套数组。例如,我有一个像:
这样的数组[{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]]
但不反对自己。也许有人知道解决方案吗?
答案 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);