在javascript中从多维数组中删除列

时间:2014-07-17 19:54:00

标签: javascript jquery multidimensional-array

我有一个2D数组:

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

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

有解决方案herehere,但它们都不是javascript,因此我无法解决相关问题。

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

谢谢!

6 个答案:

答案 0 :(得分:16)

尝试使用slice。它不会改变原始array

的任何更改
var x = array.map(function(val){
    return val.slice(0, -1);
});

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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/

答案 3 :(得分:2)

使用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数组中删除项目。原因是删除将抛出项目但不更新内部长度变量。

例如

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设置正确的长度并删除数组的项目。

答案 4 :(得分:2)

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

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

希望这就是你要找的东西

答案 5 :(得分:0)

已删除有用的代码,以创建数组的独立副本

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

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

所有失败的方法都将引用与数据一起复制。