2015-01-15 105 views
1

我有一個這樣的數組:刪除重複的無序對象

[1, {a: 'b', c: 'd'}, {c: 'd', a: 'b'}, {e: 'f'}, 'b'] 

我想要做的是,我想從這個數組無論是物體或不那麼最終刪除重複陣列可能會變成這樣:

[1, {a: 'b', c: 'd'}, {e: 'f'}, 'b'] 

我在網站上看到了很多解決方案,但沒有適用於我的問題。我怎麼能這樣做?

我嘗試這樣做:

function uniq_fast(a) { 
    var seen = {}; 
    var out = []; 
    var len = a.length; 
    var j = 0; 
    for(var i = 0; i < len; i++) { 
     var item = a[i]; 
     if(seen[item] !== 1) { 
       seen[item] = 1; 
       out[j++] = item; 
     } 
    } 
    return out; 
} 

但這刪除的第三個對象以及。

謝謝。

+0

什麼解決方案不起作用? – epascarello

+0

所有.filter和.unique(通過擴展數組)方法。 –

+0

你嘗試了什麼?請顯示您嘗試過的代碼,而不是僅僅尋求解決方案。 – wmock

回答

0

如果你只是想比較的參考,而不是對象的內容,你可以使用:

arr.reduce(function(accumulator, element){ 
    if (accumulator.indexOf(element) !== -1) return accumulator; 
    return accumulator.concat(element); 
}, []); 

否則,你需要創建一個比較對象的內容的功能,例如:

function objectsMatch(obj1, obj2) { 
    if (obj1 === obj2) return true; 
    for (var prop in obj1) { 
    if (!(prop in obj2) || obj1[prop] !== obj2[prop]) return false; 
    } 
    for (var prop in obj2) { 
    if (!(prop in obj1)) return false; 
    } 
    return true; 
} 

然後使用類似:

arr.reduce(function(accumulator, element){ 
    if (accumulator.some(function(otherElement){ 
      return objectsMatch(element, otherElement); 
     })) return accumulator; 
    return accumulator.concat(element); 
}, []); 
+0

它仍然沒有工作。 –

+0

我想比較對象的內容..s –

+0

查看我編輯的解決方案。這是否解決了你的問題? –

0

這個函數會做˚F或者你。它使用Object.keys()來交叉引用對象。如果看到填充了已知密鑰,並且已知密鑰內容是查看對象的密鑰內容的兩倍,則從對象中刪除屬性。最後,如果對象爲空,則使用拼接從數組中刪除整個對象。請注意,只有所有輸入與提供的樣本類似,此解決方案纔有效。否則該函數需要遞歸編寫。

var abc = [1, {a: 'b', c: 'd'}, {c: 'd', a: 'b'}, {e: 'f'}, 'b']; 

function uniq_fast(a) { 
    var seen = {}; 
    var deleteObject = []; 
    var len = a.length; 
    for(var i = 0; i < len; i++) { 
     if (Object.prototype.toString.call(a[i]) === '[object Array]' || Object.prototype.toString.call(a[i]) === '[object Object]') 
     { 
      var test = Object.keys(a[i]); 
      var len2 = test.length; 
      for (var j = 0; j < len2; ++j) 
      { 
       if (seen[test[j]] && a[i][test[j]] === seen[test[j]]) 
       { 
        delete a[i][test[j]]; 
       } 
       else 
       { 
        seen[test[j]] = a[i][test[j]]; 
       } 
      } 
      if (Object.keys(a[i]).length == 0) 
      { 
       deleteObject.push(i); 
      } 
     } 

    } 
    for (var i = 0; i < deleteObject.length; ++i) 
    { 
     a.splice(deleteObject[i], 1); 
    } 

    return a; 
} 

console.log(uniq_fast(abc));