2016-09-14 99 views
1

我有2个数据需要进行比较:使用Lodash比较对象数组和整数数组

人:

[ 
{id:1, name:"Bill"}, 
{id:2, name:"Sally"}, 
{id:3, name:"Steve"}, 
{id:4, name:"Rick"} 
] 

选择的范围:

[1,2,9,5] 

我知道以下内容可以帮助我筛选具有来自所选阵列的值的人物对象列表:

_(People).indexBy('id').at(chosen).value(); 

但是有可能做相反的事吗?我可以过滤Chosen数组以仅包含来自People的ID吗?

回答

1

您可以filter()find()

var arr = [ 
 
{id:1, name:"Bill"}, 
 
{id:2, name:"Sally"}, 
 
{id:3, name:"Steve"}, 
 
{id:4, name:"Rick"} 
 
] 
 

 
var chosen = [1,2,9,5]; 
 

 
var result = chosen.filter(function(e) { 
 
    return arr.find(o => o.id == e); 
 
}) 
 

 
console.log(result)

2

首先做到这一点,这些ID存储在一个哈希值。然后,在滤波所选择的是微不足道

var hash = [ 
 
    {id:1, name:"Bill"}, 
 
    {id:2, name:"Sally"}, 
 
    {id:3, name:"Steve"}, 
 
    {id:4, name:"Rick"} 
 
].reduce(function(hash,person) { 
 
    hash[person.id] = true; 
 
    return hash; 
 
}, Object.create(null)); 
 

 
var result = [1,2,9,5].filter(id => id in hash); 
 

 
console.log(result);

不同于幼稚二次方法,这种方式成本仅为线性(平均)。

2

你可以通过_.map使用_.intersectionchosen并与personid的数组。

var people = [{ id: 1, name: "Bill" }, { id: 2, name: "Sally" }, { id: 3, name: "Steve" }, { id: 4, name: "Rick" }], 
 
    chosen = [1, 2, 9, 5], 
 
    result = _.intersection(chosen, _.map(people, 'id')); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

0

你还不如做这个工作有一个单一的减少;

var arr = [ 
 
{id:1, name:"Bill"}, 
 
{id:2, name:"Sally"}, 
 
{id:3, name:"Steve"}, 
 
{id:4, name:"Rick"} 
 
], 
 
chosen = [1,2,9,5], 
 
result = arr.reduce((res,o) => { var fi = chosen.indexOf(o.id); 
 
           fi !== -1 && res.push(chosen[fi]); 
 
           return res; 
 
           },[]); 
 
console.log(result);