2014-12-24 120 views
3

我有一個arrayList與其中的對象。如果對象具有相同的值,我只需要顯示一個值。如何從arrayList中刪除重複的對象值jquery/Javascript

例如:[{a:0,b:1},{a:1,b:0},{a:0,b:1}] 從上面的例子中,我只需要顯示第一個和第二個對象,並跳過第三個對象,因爲它與第一個對象相同。

注意:數組中的對象可以是無限的,我不能硬編碼索引值。任何人都可以幫我解決這個通用解決方案

這是我曾嘗試:

points = []; 
newarr = []; 
locArray = [ {a:0,b:1},{a:1,b:0},{a:0,b:1} ]; 

if(abc!=null){ 
removeDuplicateCoordinates(); 
         $.each(newarr,function(key,val){ 
          points.push([val.a,val.b]); 

         }); 

} 

function removeDuplicateCoordinates(){ 
       var arr = locArray; 
       $.each(arr, function(index,item){ 
        if(searchForItem(newarr,item)<0){ 
         newarr.push(item); 
        } 
       }); 
      } 
      function searchForItem(array, item){ 
       var i, j, current; 
       for(i = 0; i < array.length; ++i){ 
        if(item.length === array[i].length){ 
         current = array[i]; 
         for(j = 0; j < item.length && item[j] === current[j]; ++j); 
         if(j === item.length) 
          return i; 
        } 
       } 
       return -1; 
      } 
+0

看看這些解決方案:http://jsperf.com/remove-duplicates-from-an-array-of-strings-javascript,http://jsperf.com /去重-INT陣列。希望你能輕鬆採納它們。如果不是,請選擇一個您喜歡的,我們將嘗試實施它。 –

+0

@AlexanderArutinyants:您能否實施我的結構?我很難理解您提供的參考鏈接。 –

+0

你應該保留源數組嗎? –

回答

1

首先Array.indexOf()不會比較對象。

We know that

在JavaScript對象是引用類型。兩個不同的對象永遠不會相等,即使它們具有相同的屬性。只有將相同的對象引用與其自身進行比較纔會生成true

所以,最簡單和最快的方式恕我直言,將自己比較。 這裏是工作JSFiddle

var locArray = [{ a: 0, b: 1 }, { a: 1, b: 0 }, { a: 0, b: 1 }]; 

//We will try to find if point alrady exists in array 
Array.prototype.indexOfPoint = function(point) { 
    for (var i = 0; i < this.length; i++) { 
     var arrPoint = this[i]; 
     if (arrPoint.a === point.a && arrPoint.b === point.b) 
      return i; 
    } 
    return -1; 
}; 

Array.prototype.uniquePoints = function() { 
    var a = []; 
    for (var i = 0; i < this.length; i++) { 
     var currentPoint = this[i]; 
     if (a.indexOfPoint(currentPoint) < 0) { 
      a.push(currentPoint); 
     } 
    } 
    return a; 
}; 

var newarr = locArray.uniquePoints(); 
console.log(newarr); 
2

我最喜歡的方法:

usedArray = {}; 
locArray = [ {a:0,b:1},{a:1,b:0},{a:0,b:1} ]; 
for (key in locArray) { 
    if (usedArray[JSON.stringify(locArray[key])] == undefined) { 
     console.log(JSON.stringify(locArray[key])); 
     usedArray[JSON.stringify(locArray[key])] = true; 
    } 
} 

不知道它是如何快速什麼,但每次我的作品。工作fiddle

代替console.log(JSON.stringify(locArray[key]));可以填充新的數組:

newarr.push(locArray[key]); 

編輯

測試寬度100000個對象fiddle 〜300ms的我可以忍受的。

+0

Json stringify是非常重量級的操作,在循環中使用它,你不這麼認爲嗎? –

+1

@AlexanderArutinyants是重量級,但一切取決於locArray包含多少元素。再加上一些優化和vuolia它表現不那麼糟糕。 –

+0

同意它總是取決於,而過早的優化是邪惡的:) –

3

Fiddle Demo
試試這個

newarr = []; 
    testarr = []; 
    locArray = [ {a:0,b:1},{a:1,b:0},{a:0,b:1} ]; 
    for (var i = 0; i<locArray.length;i++) 
     { 
    var idx = $.inArray(String(locArray[i].a)+String(locArray[i].b), testarr); 
    if (idx == -1) { 
     testarr.push(String(locArray[i].a)+String(locArray[i].b)); 
     newarr.push(locArray[i]); 
     } 
    } 
    console.log(newarr);