【问题标题】:Deleting a column from a multidimensional array in javascript从javascript中的多维数组中删除列
【发布时间】:2022-12-10 11:59:13
【问题描述】:

我有一个二维数组:

var array = [["a", "b", "c"],["a", "b", "c"],["a", "b", "c"]]

我想删除这个数组的整个列(即删除每个数组中的每三个元素)。

有解决方案 herehere,但它们都不在 javascript 中,所以我无法关联这些情况。

解决这个问题的最佳方法是什么?我不想使用 .splice() 因为在某些情况下我会删除多列,而 .splice() 方法会改变数组的长度,所以我最终会越界访问。

谢谢!

【问题讨论】:

  • 所以你最终会得到[["a", "b"],["a", "b"],["a", "b"]]
  • 你想删除例如每个中的第三项...(截断内部数组的长度)?还是要将其设置为 null 或空字符串? - 目前还不清楚。
  • 没有自动功能。 JS 中的“多维”数组只是数组的数组。您必须遍历父数组并从每个子数组中删除适当的元素。 “列”是一种人类便利,不会直接转化为它们在实际 JS 引擎中的实际工作方式。
  • 我想截断长度。 (例如,删除每三个元素会给我:[["a", "b"],["a", "b"],["a", "b"]]
  • 您是否尝试过删除?

标签: javascript jquery multidimensional-array


【解决方案1】:

尝试使用slice。它不会改变您原来的任何更改 array

var array = [["a", "b", "c"],["a", "b", "c"],["a", "b", "c"]]

var x = array.map(function(val) {
  return val.slice(0, -1);
});

console.log(x); // [[a,b],[a,b],[a,b]]

【讨论】:

    【解决方案2】:

    此函数不使用拼接,它会删除您想要的任何列:

    function removeEl(array, remIdx) {
     return array.map(function(arr) {
             return arr.filter(function(el,idx){return idx !== remIdx});  
            });
    };
    

    希望这就是您要找的

    【讨论】:

      【解决方案3】:

      遍历数组并拼接每个子数组:

      var idx = 2;
      for(var i = 0 ; i < array.length ; i++)
      {
         array[i].splice(idx,1);
      }
      

      JSFiddle

      编辑: 我看到你不想使用splice,因为越界问题和数组长度变化。 所以:

      1.你可以检查你是否越界并跳过切片。
      2.您可以创建一个要删除的索引数组,然后简单地从该数组中没有出现的索引创建新数组(而不是删除,创建具有相反条件的新数组)。

      是这样的:

      var array = [
          ["a", "b", "c"],
          ["a", "b", "c"],
          ["a", "b", "c"]
      ];
      
      var idxToDelete = [0,2];
      
      for (var i = 0; i < array.length; i++) {
          var temp = array[i];
          array[i] = [];
          for(var j = 0 ; j < temp.length ; j++){
              if(idxToDelete.indexOf(j) == -1) // dont delete
              {
                  array[i].push(temp[j]);
              }
          }
      }
      

      New JSFiddle

      【讨论】:

      • 关于他的“越界”问题,你可以按降序删除索引......也就是说,从最高要删除的索引,然后按自己的方式进行。
      【解决方案4】:

      使用 map 函数和 splice 函数作为您的解决方案。像这样

      var array = [["a", "b", "c"],["a", "b", "c"],["a", "b", "c"]];
      
      array = array.map(function(item){
              // the 0,2 tells the splice function to remove (skip) the last item in this array
              return item.splice(0,2);
      });
      
      console.log(array);
      // [["a", "b"],["a", "b"],["a", "b",]];
      

      不要使用 delete 从 javascript 数组中删除项目。原因是 delete 会抛出项目但不会更新内部长度变量。

      例子

      var array = ["a", "b", "c"];
      
      delete array[3];
      console.log(array);
      // ["a", "b"]
      console.log(array.length);
      // 3
      
      array = array.splice(0,2);
      console.log(array);
      // ["a", "b"]
      console.log(array.length);
      // 2
      

      使用 splice 这会设置正确的长度并删除数组的项目。

      【讨论】:

        【解决方案5】:

        您可以使用 filter 删除列,而无需修改原始数组。

        var array = [["a", "b", "c"],["a", "b", "c"],["a", "b", "c"]]
        var removeIndex = 1
        
        const filtered = array.map(v => v.filter((_, i) => i !== 1))
        // output: [["a", "c"], ["a", "c"], ["a", "c"]]
        

        您还可以使用相同的方法删除多个列。

        var array = [["a", "b", "c"],["a", "b", "c"],["a", "b", "c"]]
        var removeIndexes = [0, 2]
        
        const filtered = array.map(v => v.filter((_, i) => !removeIndexes.includes(i)))
        // output: [["b"], ["b"], ["b"]]
        

        【讨论】:

          【解决方案6】:

          splice 很酷。它会在删除内容时调整数组的大小,因此您不会以空值结束。所以使用 splice 你只需要遍历每一行并删除正确的元素。

          var removeCol = function(arr2d, colIndex) {
              for (var i = 0; i < arr2d.length; i++) {
                  var row = arr2d[i];
                  row.splice(colIndex, 1);
              }
          }
          

          http://jsfiddle.net/eB8LD/

          【讨论】:

            【解决方案7】:

            创建数组的独立副本的有用代码片段

            map 中使用slice 方法。这是一个例子:

            let arrayA = ['a', 'b', 'c', 'd']
            
            let arrayB = arrayA.map((val) => {
                  return val.slice()
            })
            
            arrayB[2] = 'Z';
            
            console.log('--------- Array A ---------')
            console.log(arrayA)
            
            console.log('--------- Array B ---------')
            console.log(arrayB)

            笔记:Angular 10中,我使用了不同的方法来获取一个数组的独立副本,但都失败了。这里是其中的一些:

            arrayB.push(arrayA) // failed    
            arrayB = Object.create(arrayA) // failed    
            arrayB = arrayA.splice() // failed
            

            所有失败的方法都在复制引用和数据。

            【讨论】:

              猜你喜欢
              • 2014-09-08
              • 1970-01-01
              • 1970-01-01
              • 2013-11-05
              • 1970-01-01
              • 2016-01-03
              • 1970-01-01
              • 2013-05-10
              • 2014-11-17
              相关资源
              最近更新 更多