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

 

 

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) : '';
})spa

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

 

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


方法一: delete

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


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

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


方法二: 取而不刪

簡單的例子:

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


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

 

同樣的結果, 咱們的思路就是既然刪除是由於咱們想要獲得符合條件的數組, 那咱們直接去篩選符合條件的新數組就解決了!

實際中咱們面對的業務數據都是比較複雜的,因此下面的稍微複雜一點

複雜的例子:

 

需求:1 咱們須要刪除掉checked爲"icon-chosen"的全部父項,以及父項中的子項orderDetails。function

   2 父項中有多個子項,但若是有一個子項checked是"icon-choose",不是"icon-chosen",那麼父項也須要保留下來不被刪除。List

 

//上面的數據保存在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屬性就好!

相關文章
相關標籤/搜索