从javascript中的多维数组中删除一列

Posted

技术标签:

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

我有一个二维数组:

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

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

有here 和here 的解决方案,但它们都不是javascript,所以我无法关联这些情况。

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

谢谢!

【问题讨论】:

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

【讨论】:

以上是关于从javascript中的多维数组中删除一列的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 中的多维数组中删除重复值

如何从 PHP 中的多维关联数组中删除项目

从php中的多维数组中删除重复值

PHP 从PHP中的多维数组中删除空项

如何从 PHP 中的多维数组中删除重复值 [重复]

08.18 javascript 06 数组 数组的概念 创建数组 读取数组中的元素 稀疏数组 添加和删除数组的元素 数组遍历 多维数组 数组的方法 类数组对象 作为数组的字符串