2013-07-03 127 views
1

我有一個對象數組,如下所示。第一部分代碼位於一個循環中,在該循環中創建'Item'的多個對象並將其推送到數組中。爲重複值過濾陣列

此問題的示例可在此處獲得:http://jsfiddle.net/X6VML/
請注意,如何更改文本框內的值會顯示重複的項目。

// class 
var Item = function(label, value) { 
    this.Label = label; 
    this.Value = value; 
}; 

var obj = new Item("My Label", "My Value"); 

// adds object onto array 
itemArray.push(obj); 

我的問題是,該陣列可以包含我需要撕心裂肺的對象列表到一個表之前過濾掉重複的對象,如下圖所示:

for (var i = 0; i < itemArray.length; i++) { 
     $('.MyTable').append("<tr><td>" + itemArray[i].Label + "</td><td>" + itemArray[i].Value + "</td></tr>"); 
    } 

我可以確定它是否是價值相同的副本。如何根據值是否已經存在於數組中來過濾對象列表?

非常感謝

回答

0

一個簡單的解決辦法是:

var temp = []; 
$.each(itemArray, function(index, obj){ 
    var found = false; 
    $.each(temp, function(tempI, tempObj){ 
     if(tempObj.Value == obj.Value){ 
      found = true; 
      return false; 
     } 
    }); 

    if(!found){ 
     temp.push(obj); 
    } 
}); 

itemArray = temp; 
console.log(itemArray); 

上面簡單地遍歷陣列中的每個對象,並將其推到臨時數組,如果它不是已存在,最後它覆蓋itemArraytemp


您是否考慮在添加到數組時刪除重複項?類似這樣的:

function UniqueItemList(){ 
    var items = []; 

    this.push = function(item){ 
     for(var i=0; i<items.length; i++){ 
      if(items[i].Value == item.Value){ 
       return; 
      } 
     } 
     items.push(item); 
    }; 

    this.getList = function(){ 
     return items; 
    } 
} 

var myList = new UniqueItemList(); 

myList.push(new Item('label1', 'value1')); 
myList.push(new Item('label2', 'value2')); 
myList.push(new Item('label1', 'value1')); 
myList.push(new Item('label1', 'value1')); 

console.log(myList.getList()); 

如果您嘗試推送重複項目,它將被拒絕。

Demo - 在這裏它被集成到你的代碼中。

+0

這將是理想..只是看你的建議 –

+0

只是想明白它,看起來很有前途.. –

+0

請看我的例子在這裏:http:// jsfiddle。net/X6VML/ –

0

這段代碼會做。在形成HTML之前修改itemArray。

var arr = {}; 
for (var i=0; i < itemArray.length; i++) 
    arr[itemArray[i].Value] = itemArray[i]; 
itemArray = new Array(); 
for (key in arr) 
    itemArray.push(arr[key]); 
+0

其實非常接近。你能解釋一下它在做什麼嗎? –

+0

因爲obj.value應該是唯一的,所以使用obj.value作爲key和obj作爲值創建映射。這消除了重複的條目。 – Arvindkumar

0

我有這個方便的實用功能:

function uniq(ary, key) { 
    var seen = {}; 
    return ary.filter(function(elem) { 
     var k = (key || String)(elem); 
     return seen[k] === 1 ? 0 : (seen[k] = 1); 
    }) 
} 

其中key是提取從一個元素比較關鍵的功能。

適用於你的使用情況:

uniqueItems = uniq(itemArray, function(item) { return item.Value }) 
1

只是不要在陣列添加重複的項目:

var item = new Item("My Label", "My Value1"); 

if(!$.grep(itemArray, function(obj) { return obj.Value == item.Value; }).length) 
    itemArray.push(item); 

如果已經存在itemArray與價值"My Value1"一個對象,只是不添加它。

+0

這將是理想的明顯..我確定這段代碼是偉大的,但你可以重寫它,也許我可以看到它在做什麼嗎?謝謝, –

+0

檢查文檔$ .grep()方法http://api.jquery.com/jQuery.grep/。對不起,我不明白你的意思,所以我可以看到它在做什麼?順便說一句,如果你提供相關的代碼作爲你如何在數組中添加新項目,這將是更有用的。 –