【问题标题】:Deleting a column from a multidimensional array in javascript从javascript中的多维数组中删除一列
【发布时间】:2014-09-08 20:18:20
【问题描述】:

我有一个二维数组:

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】:

截取有用的代码,创建数组的独立副本

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

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

【讨论】:

    【解决方案2】:

    尝试使用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]]

    【讨论】:

      【解决方案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.

      【讨论】:

      • 关于他的“越界”问题,您可以按降序删除索引...也就是说,从 highest 索引开始删除并正常工作一路下来。
      【解决方案4】:

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

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

      希望这就是你要找的东西

      【讨论】:

        【解决方案5】:

        为您的解决方案使用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 设置正确的长度并删除数组的项。

        【讨论】:

          【解决方案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/

          【讨论】:

            猜你喜欢
            • 2022-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-05
            • 1970-01-01
            • 2016-01-03
            • 1970-01-01
            • 2013-05-10
            相关资源
            最近更新 更多