过滤具有数组字段的对象数组使用Lodash

时间:2016-09-14 21:35:06

标签: javascript arrays filter lodash

我有2个数据集:

人:

[
    {id:1, selected:[1,2,3,4]},
    {id:2, selected:[1,2,3,4,5]},
    {id:3, selected:[11]},
    {id:4, selected:[1,2,5]}
]

selectedArray:

[1,2,3]

我可以按People.id

过滤selectedArray
_(People).indexBy('id').at(selectedArray).value();

但是我对如何过滤未表示为单个值的字段感到困惑。例如。 People[0].selected这是一个整数数组。

是否可以仅在People的人员选定字段中显示包含至少1个整数的selectedArray个对象?

我试过了:

_.intersection(selectedArray, _.map(People, 'selected'));

我最终希望拥有一个People对象数组,其中所选字段仅限于selectArray的整数。结果将是:

[
    {id:1, selected:[1,2,3]},
    {id:2, selected:[1,2,3]},
    {id:4, selected:[1,2]}
]

我目前正在通过for循环来计算这个,但我不认为这是一个非常好的解决方案,我想知道是否有更优雅的方法而不是遍历整个对象数组。

1 个答案:

答案 0 :(得分:2)

您可以在过滤器(vanilla js)中使用Array.some:



var sel = [1,2,3]

var arr = [
    {id:1, selected:[1,2,3,4]},
    {id:2, selected:[1,2,3,4,5]},
    {id:3, selected:[11]},
    {id:4, selected:[1,2,5]}
]

var res = arr.filter(x => x.selected.some(y => sel.some(z => z === y))).
map(x => {
 x.selected = x.selected.filter(y => sel.some(z => z === y));
 return x;
})

console.log(res)




或在lodash



var sel = [1,2,3]

var arr = [
     {id:1, selected:[1,2,3,4]},
     {id:2, selected:[1,2,3,4,5]},
     {id:3, selected:[11]},
     {id:4, selected:[1,2,5]}
]
var res = _.filter(arr, x => _.some(x.selected, y => _.some(sel, z => z == y)))

console.log(res)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
&#13;
&#13;
&#13;