【问题标题】:Delete a subarray in an array in JavaScript using for loop使用for循环在JavaScript中删除数组中的子数组
【发布时间】:2018-09-29 06:28:59
【问题描述】:

如果子数组有特定元素,我需要删除它。

function filteredArray(arr, elem) {
  let newArr = [];
  for (let i = 0; i < arr.length; i++){
    for (let j = 0; j < arr[i].length; j++) {
      if (arr[i][j] === elem) {
        arr.splice(i--, 1);
        newArr = [...arr]
      }
    }
  }
  return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 19));

如果元素只被找到一次(例如 19),上面的代码就可以正常工作。但如果我尝试 3 号,我会得到:Uncaught TypeError: Cannot read property 'length' of undefined。有人可以解释一下这里发生了什么吗?

【问题讨论】:

    标签: javascript arrays multidimensional-array array-splice


    【解决方案1】:

    filter()includes() 一起使用很简洁,您可能不需要单独的函数:

    let array = [[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]]
    let filtered = array.filter(item => !item.includes(19));
    console.log(filtered)

    【讨论】:

      【解决方案2】:

      问题在于,一旦您将 spliced 从数组中取出一个项目,您的程序就会继续迭代已删除的内部数组的其余部分,就好像它仍然存在一样。在3 作为目标的情况下,每个内部数组都将被删除,因为它们都包含3。在最终删除时,您在内部数组的索引1 和最后一个内部数组的splice 处检测到3。在循环的下一次迭代中,程序在尝试在空数组[] 中索引[0][2] 时崩溃。

      解决方法是添加break语句如下;这将中止对已删除数组的进一步检查:

      function filteredArray(arr, elem) {
        let newArr = [];
        
        for (let i = 0; i < arr.length; i++){
          for (let j = 0; j < arr[i].length; j++) {
            if (arr[i][j] === elem) {
              arr.splice(i--, 1);
              newArr = [...arr]
              break;
            }
          }
        }
        return newArr;
      }
      console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));

      话虽如此,您可以采取许多更简单的方法;例如,使用array.filter(),它根据参数函数返回的真值选择元素:

      const filteredArray = (a, target) => a.filter(e => !e.includes(target));
      
      console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
      console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 19));

      【讨论】:

      • 非常感谢我提供的代码的解释和解决方案。 :) 当然我会使用过滤器。
      【解决方案3】:

      试试 Array.filter()

      function filteredArray(arr, skip) {
        return arr.filter(function(sub) {
          return -1 === sub.indexOf(skip);
        });
      }
      
      var mixed = [[3, 2, 3], [1, 6, 2], [3, 13, 26], [19, 3, 9]];
      console.log(filteredArray(mixed, 19));
      console.log(filteredArray(mixed, 3));

      【讨论】:

      • 这里采用了更好的逻辑
      • Arvind,感谢您提供出色的解决方案和简洁的代码。
      猜你喜欢
      • 1970-01-01
      • 2021-03-03
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多