2016-09-14 77 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);