【问题标题】:Remove given cells in 2D Array in javascript在javascript中删除二维数组中的给定单元格
【发布时间】:2019-08-02 07:01:09
【问题描述】:

给定一个数组和单元格索引,删除所有给定的单元格索引。

输入:

[[0,1,2,3,4,5],
 [0,1,2,3,4,5],
 [0,1,2,3,4,5]
]

细胞:

(0,1) (1,1), (2,4), (0,2)

预期输出:

[[0,3,4,5],
 [0,2,3,4,5],
 [0,1,2,3,5]
]

当我试图删除原始数组时,我无法删除正确的索引。在删除所有内容之前,我们不应该更改数组。

  obj[key].forEach(element => {
    arr[element].splice(key, 1)
  });

【问题讨论】:

    标签: javascript arrays multidimensional-array data-structures ecmascript-6


    【解决方案1】:

    有点不同的方法。

    let cellsToRemove = [
        [1, 2], //(0,1) + (0,2)
        [1], //(1,1)
        [4], //(2,4)
    ];
    let arr = [
        [0, 1, 2, 3, 4, 5],
        [0, 1, 2, 3, 4, 5],
        [0, 1, 2, 3, 4, 5]
    ];
    
    
    let newArr = [];
    for (i = 0; i < arr.length; i++) {
        newArr.push(arr[i].filter((item) => {
            return !cellsToRemove[i].includes(item)
        }));
    }
    console.log(newArr);
    

    我认为特里的解决方案是最好的。

    【讨论】:

      【解决方案2】:

      您可以按第二个索引降序对索引进行排序,因为splice 会更改索引。

      var array = [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]],
          remove = [[0, 1], [1, 1], [2, 4], [0, 2]];
          
      remove
          .sort((a, b) => b[1] - a[1])
          .forEach(([i, j]) => array[i].splice(j, 1));
      
      array.map(a => console.log(...a));

      【讨论】:

        【解决方案3】:

        不是最有效的,但这是一个快速而肮脏的解决方案,reducemap

        const input = [
          [0,1,2,3,4,5],
          [0,1,2,3,4,5],
          [0,1,2,3,4,5]
        ];
        
        const removals = [[0,1], [1,1], [2,4], [0,2]];
        const _ = {};
        const output = removals
          .reduce((a, [x, y]) => (a[x][y] = _, a), input)
          .map(r => r.filter(c => c !== _));
        output.forEach(r => console.log(...r));

        我解决了移动索引的问题,只需在一次扫描中使用占位符 (_) 标记要删除的单元格,然后在另一次扫描中返回以删除所有标记的单元格。

        另一种解决方案是 sort 在循环遍历它们之前删除要删除的索引,然后您可以像往常一样 splice 输出项目。

        const input = [
          [0,1,2,3,4,5],
          [0,1,2,3,4,5],
          [0,1,2,3,4,5]
        ];
        
        const removals = [[0,1], [1,1], [2,4], [0,2]];
        const output = removals
          .sort(([a, b], [c, d]) => d - b)
          .reduce((a, [x, y]) => (a[x].splice(y, 1), a), input);
        output.forEach(r => console.log(...r));

        【讨论】:

          【解决方案4】:

          您的怀疑是正确的:由于您在遍历要删除的单元格坐标时拼接矩阵中的嵌套数组,因此当您在第一次之后返回同一行时最终会删除不正确的项目。例如:

          • 使用Array.prototype.splice() 删除(0,1) 处的单元格会将第一行从[0,1,2,3,4,5] 更改为[0,2,3,4,5]
          • 当您再次遇到同一行时,例如删除(0,2) 处的另一个单元格,实际上您现在正在从第一行中删除3,因为该行现在已经发生了变异

          为避免这种情况,唯一的方法是用null 替换您要在第一遍中删除的单元格中的值。然后,再次遍历矩阵以删除这些 null 值:

          const matrix = [
            [0,1,2,3,4,5],
            [0,1,2,3,4,5],
            [0,1,2,3,4,5]
          ];
          
          const cellsToRemove = [
            [0,1],
            [1,1],
            [2,4],
            [0,2]
          ];
          
          cellsToRemove.forEach(cell => {
            const x = cell[0];
            const y = cell[1];
            matrix[x][y] = null;
          });
          
          const newMatrix = matrix.map(row => {
            return row.filter(col => col !== null);
          });
          console.log(newMatrix);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-17
            相关资源
            最近更新 更多