刪除數組中多個不連續的數組元素的正確姿勢


 

 

var arr = ['a', 'a', 'b', 'c', 'd', 'a', 'a', 'e', 'g', 'a', 'f'];

 

我們現在將數組中所有的‘ a’ 元素刪除;

arr.forEach(function(key, index) {
key === 'a' ? arr.splice(index, 1) : '';
})

//["a", "b", "c", "d", "a", "e", "g", "f"]

 

只要相鄰的‘ a’ 元素, 都沒被刪除, splice不但可以刪除原素本身, 還同時可以減少數組長度( 就是抹去一切痕跡),
這樣導致后續的數組元素會代替已經刪除的元素的位置, 但是循環是按照數組的下標按順序刪除, 這樣就會漏掉遷移的元素。


方法一: delete

arr.forEach(function(key, index) {
key === 'a' ? delete arr[index] : '';
})


//["b", "c", "d", "e", "g", "f"]

可以看到這是我們想要的結果, 因為delete這個方法刪除元素時並不會刪除本身的位置, 會有個‘ undefind’ 來代替着元素,
這樣我們的循環隊列的順序就正常了, 但是這樣數組長度是不會有變化的, 這個方法就看自己的需求了


方法二: 取而不刪

簡單的例子:

var newArr = arr.filter(function(key) {
return key !== 'a'
})


//["b", "c", "d", "e", "g", "f"]

 

一樣的結果, 我們的思路就是既然刪除是因為我們想要得到符合條件的數組, 那我們直接去篩選符合條件的新數組就解決了!

實際中我們面對的業務數據都是比較復雜的,所以下面的稍微復雜一點

復雜的例子:

 

需求:1 我們需要刪除掉checked為"icon-chosen"的所有父項,以及父項中的子項orderDetails。

   2 父項中有多個子項,但如果有一個子項checked是"icon-choose",不是"icon-chosen",那么父項也需要保留下來不被刪除。

 

//上面的數據保存在productList中,我們看到只有數組中第一個父元素的第二個子元素checked是"icon-choose"

var newProductList = [];

productList.forEach(function(key) {

  //首先篩選父項"icon-choose",取出我們需要的父項

  if (key.checked == "icon-choose") {

    //篩選子項"icon-choose",取出我們需要的子項

    var newOrderDetails = key.orderDetails.filter(function(keys) {

      return keys.checked == "icon-choose"

  });

    //將符合條件的子項賦值給被篩選的子項

    key.orderDetails = newOrderDetails;

    //將篩選和改變的父項放入新的數組

    newProductList.push(key);
  }

})

console.info(newProductList);

最后的結果就是要保留數組中第一個父元素的第二個子元素checked是"icon-choose",同時保留父元素;數據可能有點多,但其他的只是干擾項,

我們只關注checked屬性就好!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM