删除数组中多个不连续的数组元素的正确姿势

 

 

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属性就好!

 

posted @ 2016-12-25 17:59  萧了个晓  阅读(6754)  评论(0编辑  收藏  举报