我有一个长度为9的数组。我想从数组中删除elem。
arr = [
[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 1],
[1, 2],
[2, 0],
[2, 1],
[2, 2]
]
let elem = [2, 0];
let index = arr.indexOf(elem)
if (index !== -1) {
arr.splice(arr.indexOf(elem), 1)
}
console.log(arr)
为什么我的接头不起作用?
答案 0 :(得分:3)
除了同一个对象引用外,不能将Array#indexOf
与另一个对象引用一起使用。这意味着,如果您要检查另一个数组,则需要逐个元素对其进行迭代。为此,您可以使用Array#findIndex
并用Array#every
迭代所有元素。
对于拼接,您需要找到的索引,而不是找到另一个索引,因为已经有了它。
var arr = [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]],
elem = [2, 0],
index = arr.findIndex(a => a.every((v, i) => elem[i] === v));
console.log(index);
if (index !== -1) {
arr.splice(index, 1);
}
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
您可以改用.filter()
:(有关.filter()here)的更多信息
arr = [
[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 1],
[1, 2],
[2, 0],
[2, 1],
[2, 2]
]
let elem = [2, 0];
const newArray = arr.filter(item => !(item[0] === elem[0] && item[1] === elem[1]));
console.log(newArray)
.as-console-wrapper { max-height: 100% !important; top: 0; }
这只是检查数组的两个部分是否匹配,然后反转结果,因此仅返回不匹配的那些
并不是说现在有很大的不同,但是.filter()
也更快-Here's a test I ran on JSPerf
答案 2 :(得分:0)
您可以使用过滤器功能
arr = [
[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 1],
[1, 2],
[2, 0],
[2, 1],
[2, 2]
]
let m = [];
let elem = [2, 0];
let __j = elem.toString();
let k = arr.filter(function(item) {
let __i = item.toString();
return __i !== __j
})
console.log(k)
答案 3 :(得分:0)
您可以使用JSON对象快速删除元素:
arr = [
[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 1],
[1, 2],
[2, 0],
[2, 1],
[2, 2]
]
let elem = [2, 0];
var arrjson = arr.map(JSON.stringify);
var elemjson = [elem].map(JSON.stringify);
//console.log(arrjson); //console.log(elemjson);
var index = arrjson.indexOf(elemjson[0]);
arrjson.splice(index,1);
//console.log(arrjson);
var arrresult = arrjson.map(JSON.parse);
console.log(arrresult);