2016-11-08 55 views
1

刪除所有特定對象:從給定數組的數組

myArr = [ 
    {'a':1}, 
    {'b':1}, 
    {'b':2}, 
    {'a':1}, 
    {'b':2} 
] 

和索引0,其中有對象{'a':1},我想找回陣列: [{'b':1},{'b':2},{'b':2}]保持原來的排序順序。

即刪除索引0中的對象和所有其他等效的對象。 有沒有一種優雅的方式?

+0

你怎麼知道哪個對象刪除?你會傳遞一個引用來刪除或某些值,如數組索引,例如? – nem035

+0

@ nem035我解釋了一下。 thx –

+0

可能重複[Javascript:如何根據屬性過濾對象數組?](http://stackoverflow.com/questions/2722159/javascript-how-to-filter-object-array-based-on-attributes) – Rajesh

回答

4

如果你想刪除相同的對象,這很簡單:

a1 = { a: 1 } 
 
    b1 = { b: 1 } 
 
    b2 = { b: 2 } 
 
    myArr = [ a1, b1, b2, a1, b2 ] 
 
    
 
    var filtered = myArr.filter(o => o != a1) 
 
    console.log(filtered); 
 
    // [ {b: 1}, {b: 2}, {b: 2} ]

但是,如果要刪除等效對象,則會變得複雜,因爲默認情況下JavaScript不具有對象等價性測試。您可以自己實現一個,或依靠像lodash庫之一:,

var myArr = [ 
 
    {'a':1}, 
 
    {'b':1}, 
 
    {'b':2}, 
 
    {'a':1}, 
 
    {'b':2} 
 
]; 
 

 
var filtered = _.filter(myArr, o => !_.isEqual(o, {a: 1})); 
 
console.log(filtered); 
 
// [ {b: 1}, {b: 2}, {b: 2} ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>

話又說回來,如果你正在使用lodash,你可能也只是用它來充分程度:

var myArr = [ 
 
    {'a':1}, 
 
    {'b':1}, 
 
    {'b':2}, 
 
    {'a':1}, 
 
    {'b':2} 
 
]; 
 

 
var filtered = _.differenceWith(myArr, [{a: 1}], _.isEqual); 
 
console.log(filtered); 
 
// [ {b: 1}, {b: 2}, {b: 2} ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>

基本上不相同的東西,但更易讀一點。

+1

@Rajesh:我已經在上面解釋過,這與您發佈的鏈接完全不同。請停止。 – Amadan

+0

@Rajesh:如果'{a:1}'「和其他所有」相同「值的對象都被刪除,爲什麼要刪除'{a:1,b:2}? 「{a:1}」與「{a:1,b:2}」的值不同。「刪除等價對象」和「基於屬性刪除元素」是兩個不同的問題; OP的意圖非常明確。 – Amadan

+0

@Rajesh _「但是OP仍然在尋找一種過濾數組的方法,如果有一個對象'{a:1,b:2}',那麼即使這樣也應該被移除」_這不是問題的要求是。 OP不要求刪除'b:2'。 _「和索引0,它有對象'{'a':1}',我想返回數組:'[{'b':1},{'b':2},{' b':2}]'保持原來的排序順序。「OP在哪裏描述刪除'b:2'? – guest271314

-3

嘗試myArr.shift();

它將返回{'a':1}

而且myArr,該會[{'b':1},{'b':2},{'b':2}]

0

這對我的作品

myArr = [ 
      {'a':1}, 
      {'b':1}, 
      {'b':2}, 
      {'a':1}, 
      {'b':2} 
     ] 

     //Get first item 
     for(var key in myArr[0]){ 
      var firstItem = key; 
     } 
     alert('First item: ' + firstItem); 

     //Remove matches 
     var removedItems = []; //Not needed, just used to show you what it's removing. 

     myArr.forEach(function(item){ 
      for (var key in item){ 
       if(key == firstItem){ 
        removedItems.push(key); //Not needed 
        myArr.splice(item, 1); //Remove the array entry 
       } 
      } 
     }); 
     alert('Removed items: ' + removedItems); 
相關問題