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


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

  • 相关阅读:
    Run command in YMAL build pipeline or Release Pipeline
    Create Pipeline for Azure Apps
    Deploy Azure App Service with VS Code
    多线程总结笔记
    @Param注解
    Mac Idea2018.1破解
    空指针异常Caused by: java.lang.NullPointerException: null
    java集合面试题
    在IntelliJ IDEA中使用git
    分支管理
  • 原文地址:https://www.cnblogs.com/xiaojingyuan/p/6220045.html
Copyright © 2020-2023  润新知