2016-08-15 148 views
-1

我需要刪除所有重複的元素,例如:如何刪除冗餘陣列對象

var arr = [ 
    {'seriesIndex':1,pointIndex:0}, 
    {'seriesIndex':1,pointIndex:1}, 
    {'seriesIndex':0,pointIndex:0}, 
    {'seriesIndex':1,pointIndex:0}, 
    {'seriesIndex':1} 
] 

如何從陣列中去除冗餘(一式兩份)數組對象?

我的預期輸出是:

arr = [ 
    {'seriesIndex':1,pointIndex:0}, 
    {'seriesIndex':1,pointIndex:1}, 
    {'seriesIndex':0,pointIndex:0}, 
    {'seriesIndex':1} 
] 

如何實現這一目標?

+5

的[刪除從JavaScript陣列重複(http://stackoverflow.com/questions/9229645/remove-duplicates-from-javascript-array)可能的複製包含的最好的一個我在所見過的所有答案中仍然保持誠實(第二個答案) –

回答

2

在香草的Javascript,我建議保持碰到組合鍵的軌道,同時在.reduce()方法列表上進行迭代。 prv.key[key]的測試是O(1)(哈希表查找),所以這個算法是O(n)。

var arr = [ 
 
    {seriesIndex:1, pointIndex:0}, 
 
    {seriesIndex:1, pointIndex:1}, 
 
    {seriesIndex:0, pointIndex:0}, 
 
    {seriesIndex:1, pointIndex:0}, 
 
    {seriesIndex:1} 
 
]; 
 

 
arr = arr.reduce(function(prv, cur) { 
 
    var key = cur.seriesIndex + '/' + cur.pointIndex; 
 

 
    if(!prv.key[key]) { 
 
    prv.key[key] = true; 
 
    prv.res.push(cur); 
 
    } 
 
    return prv; 
 
}, {key: {}, res: []}).res; 
 

 
console.log(arr);

+0

這不適用於IE8 –

0

截至Object.prototype.compare()的發明,你可以做這樣的

Object.prototype.compare = function(o){ 
 
    var ok = Object.keys(this); 
 
    return typeof o === "object" && ok.length === Object.keys(o).length ? ok.every(k => this[k] === o[k]) : false; 
 
}; 
 

 
var arr = [{'seriesIndex':1,pointIndex:0}, 
 
      {'seriesIndex':1,pointIndex:1}, 
 
      {'seriesIndex':0,pointIndex:0}, 
 
      {'seriesIndex':1,pointIndex:0}, 
 
      {'seriesIndex':1} 
 
      ], 
 
result = arr.reduce((res,obj) => res.length === 0 ? res.concat(obj) 
 
                : !!res.find(o => obj.compare(o)) ? res 
 
                        : res.concat(obj),[]); 
 
console.log(JSON.stringify(result,null,2));

1

我使用的庫,裏面有豐富的API - lodash

隨着lodash它看起來像:

_.uniqWith(arr, _.isEqual) 

這是sim PLE和短

鏈接到庫https://lodash.com/