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

use*_*174 12 javascript jquery multidimensional-array

我有一个2D数组:

var array = [["a", "b", "c"],["a", "b", "c"],["a", "b", "c"]]
Run Code Online (Sandbox Code Playgroud)

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

这里这里有解决方案,但它们都不是javascript,所以我遇到了麻烦.

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

谢谢!

Rah*_*zir 19

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

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

console.log(x); // [[a,b],[a,b],[a,b]]
Run Code Online (Sandbox Code Playgroud)


ser*_*eyz 8

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

function removeEl(array, remIdx) {
 return array.map(function(arr) {
         return arr.filter(function(el,idx){return idx !== remIdx});  
        });
};
Run Code Online (Sandbox Code Playgroud)

希望这是你正在寻找的


Ami*_*ich 6

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

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

JSFiddle.

编辑:我看到你不想使用splice由于越界问题和数组长度的变化.所以:

你可以检查一下你是否超出界限并跳过切片.
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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

新JSFiddle.

  • 关于他的"越界"问题,您可以按降序删除索引...也就是说,从*最高*索引开始删除并向下工作. (2认同)

小智 6

您可以使用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"]]
Run Code Online (Sandbox Code Playgroud)

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

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"]]
Run Code Online (Sandbox Code Playgroud)