2012-08-06 40 views
3

可能重複:有一個JSON字符串像
Array unique values
Get unique results from JSON array using jQuery如何使一個JSON陣列獨特

林本

[ 
Object { id="38",product="foo"}, 
Object { id="38",product="foo"}, 
Object { id="38",product="foo"}, 
Object { id="39",product="bar"}, 
Object { id="40",product="hello"}, 
Object { id="40",product="hello"} 

] 

中有重複的值這個JSON數組.. ..我可以讓這個JSON數組唯一這樣

[ 
Object { id="38",product="foo"}, 
Object { id="39",product="bar"}, 
Object { id="40",product="hello"} 
] 

.IM尋找使用較少的迭代建議, Jquery $.inArray沒有在這種情況下工作。

建議使用任何第三方庫,歡迎使用。

+0

你想用相同的ID /產品組合或者只是用相同的ID刪除元素? – davids 2012-08-06 10:18:39

+1

要做到這一點,最有效的方法是將數組轉換爲散列元素作爲鍵。然後將哈希變成一個數組。應該給你'O(n)'。 – freakish 2012-08-06 10:21:29

+0

其實這與JSON無關;) – 2012-08-07 08:36:58

回答

1

您可以自己輕鬆編寫代碼。從頭頂開始想起這個。

var filtered = $.map(originalArray, function(item) { 
    if (filtered.indexOf(item) <= 0) { 
     return item; 
    } 
}); 

或以手提出了一個更高效的算法專門針對情況:

var helper = {}; 
var filtered = $.map(originalArray, function(val) { 
    var id = val.id; 

    if (!filtered[id]) { 
     helper[id] = val; 
     return val; 
    } 
}); 
helper = null; 
+0

相當無效。在最壞的情況下,'O(n^2)'。 – freakish 2012-08-06 10:20:13

+0

如果返回的數據確實具有ID,那麼當然帶有ID鍵的哈希映射將是最有效的。 – 2012-08-06 10:22:35

+0

+1:沒錯。如果OP想要一個數組,那麼他可以很容易地將'filtered'轉換成一個數組。就計算複雜度而言,該解決方案應該是'O(n)',儘管使用至少兩倍的內存。不過應該不會是個問題(無論如何,誰會把這麼大的JSON發送給客戶端?)。 – freakish 2012-08-06 10:27:42

5

您可以使用underscore's uniq

在你的情況,你需要提供一個迭代提取「ID」:通過刪除重複項

array = _.uniq(array, true /* array already sorted */, function(item) { 
    return item.id; 
}); 
1

你可能要循環。如果存儲的項目都是爲了你建議,這是一個循環的一個簡單的問題:

function removeDuplicates(arrayIn) { 
    var arrayOut = []; 
    for (var a=0; a < arrayIn.length; a++) { 
     if (arrayOut[arrayOut.length-1] != arrayIn[a]) { 
      arrayOut.push(arrayIn[a]); 
     } 
    } 
    return arrayOut; 
} 
3

首先假設你有有效的JSON

myList= [ 
    { "id":"38","product":"foo"}, 
    { "id":"38","product":"foo"}, 
    { "id":"38","product":"foo"}, 
    { "id":"39","product":"bar"}, 
    { "id":"40","product":"hello"}, 
    { "id":"40","product":"hello"} 
] 

你是什麼基本上試圖做的是將這個對象列表變成字典

var newDict = {} 

for(var i=0; i<myList.length; i++) { 
    newDict[myList[i]['id']] = myList[i]['product'] 
} 

newDict現在是:

{ 
    '38': 'foo', 
    '39': 'bar', 
    '40': 'hello' 
} 
+0

如果您需要鍵值對中的數據,這很好。但是,如果您需要密鑰,請爲模板說明,這不是最佳解決方案。 – 2012-08-06 11:42:36