2016-04-25 207 views
2

我需要將此數組對象的減少Lodash:從陣列中除去連續的重複

[ 
    {id:1, value:'A'}, 
    {id:2, value:'B'}, 
    {id:3, value:'B'}, 
    {id:4, value:'B'}, 
    {id:5, value:'A'}, 
    {id:6, value:'A'}, 
    {id:7, value:'B'} 
] 

[ 
    {id:1, value:'A'}, 
    {id:2, value:'B'}, 
    {id:5, value:'A'}, 
    {id:7, value:'B'} 
] 

如果連續的對象具有相同的值時,它使第一個和刪除休息。

我目前的解決方案是

var lastValue = undefined; 
var result = []; 
var propPath = 'value'; // I need later to reference nested props 

objects.filter(function(object){ 
    var value = _.at(object, propPath); 
    if (!_.isEqual(value, lastValue)){ 
    result.push(object); 
    lastValue = value; 
    } 
}); 

console.log(result); 

我的問題是,作爲Lodash有很多的功能,有沒有更簡單地這樣做的Lodash方式?也許一些預先構建的解決方案不使用幫助變量(lastValue和result)。

回答

2

這可以用.reject解決:

_.reject(objects, function (object, i) { 
    return i > 0 && objects[i - 1].value === object.value; 
}); 

DEMO

+0

這正是我需要的,但lodash [文件](https://lodash.com/docs#拒絕)沒有提到謂詞的第二個參數(索引)。文檔是否過時或者這是非官方的,內部的還是可以改變的? –

+0

所有操作集合的方法都有一個帶三個參數的謂詞:'(value,index | key,collection)'。我猜這只是在'_.reject'文件中丟失,但其他人有這個細節('_.filter','_.map','_.forEach','_.every','_.some',等等)。對於信息,第三個參數'collection'在某些情況下是有用的,例如, '_.filter(_。sortBy(items,'id'),function(item,i,sortedItems){...}'。 –