2014-09-30 86 views
3

我有以下JS數組:從JS陣列刪除重複

var items=[ 
    { id: 1, name: 'aa' }, 
    { id: 1, name: 'bb' }, 
    { id: 2, name: 'cc' }, 
    { id: 1, name: 'dd' } 
]; 

我灣將其轉換爲如下。

var items=[ 
    { id: 1, name: 'dd' }, 
    { id: 2, name: 'cc' } 
]; 

我該如何使用JavaScript去解決它?

+0

http://stackoverflow.com/questions/23507853/remove-duplicate-objects-from-json-array – 2014-09-30 10:24:38

回答

1

我們實際上可以很簡單地做到這一點,只是循環而已。對於每個項目,將其位置分配到與其ID相對應的新陣列中。之前的ID會被覆蓋,所以只保存最後一個ID。

var items=[ 
 
    { id: 1, name: 'aa' }, 
 
    { id: 1, name: 'bb' }, 
 
    { id: 2, name: 'cc' }, 
 
    { id: 1, name: 'dd' } 
 
], newItems = []; 
 
for (var i =0;i<items.length;i++){ 
 
    newItems[items[i].id - 1] = items[i]; 
 
} 
 
alert(JSON.stringify(newItems));

+0

如果ID是不連續? – Adam 2014-09-30 10:29:38

+0

@Adam然後會有一些空的列表項。那些可以很容易地被濾除。 – Scimonster 2014-09-30 10:30:35

+0

@Scimonster - 這是一個很好的解決方案,但是,如果你想根據任何字符串數據過濾掉數據,那麼它將無法工作。 – prog1011 2014-09-30 11:00:26

0

試試這個:

items = items.reverse().filter((function() { 
    var existing = {}; 
    return function(item) { 
     if(existing[item.id]) { 
      return false; 
     } 
     existing[item.id] = true; 
     return item; 
    } 
}())); 
+0

由於我們正在過濾,是的,讓我們使用'filter'!但是,內部可以清理一點。 'return!existing [item.id] && existing [item.id] = true;'? – 2014-09-30 11:27:40

0

這應該做你想要什麼:

var items = [ 
    { id: 1, name: 'aa' }, 
    { id: 1, name: 'bb' }, 
    { id: 2, name: 'cc' }, 
    { id: 1, name: 'dd' } 
]; 

function removeDupIds(items){ 
    var result = [], 
     uniqIds = {}, 
     i  = 0, 
     l  = items.length; 

    for(; i<l; i++){ 
     uniqIds[items[i].id] = items[i].name; 
    } 

    for(var k in uniqIds){ 
     result.push({id: k, name: uniqIds[k]}); 
    } 
    return result; 
} 

console.log(removeDupIds(items)); 
0

使用下劃線,這純粹是

_.uniq(items.reverse(), function(i1, i2) { return i1.id === i2.id; })) 

_.uniq通常去除相同的項目,但是我們可以通過它的第二個參數指定一個函數的使用,以確定是否兩個項目要被視爲是相同的。

items.reverse()需要,因爲OP似乎想最後的項目優先。