从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中的多维数组中删除一列的主要内容,如果未能解决你的问题,请参考以下文章
08.18 javascript 06 数组 数组的概念 创建数组 读取数组中的元素 稀疏数组 添加和删除数组的元素 数组遍历 多维数组 数组的方法 类数组对象 作为数组的字符串