2016-08-15 4 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) содержит один из лучших ответы, которые я видел на SO, но все честно (второй ответ) –

ответ

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) 

Это сим PLE и короткая

Ссылка на библиотеку https://lodash.com/

Смежные вопросы