无法使用拼接删除元素
Can't remove element using splice
我有一个长度为 9 的数组。我想从数组中删除元素。
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)
为什么我的拼接不起作用?
无法使用Array#indexOf
with another object reference than the same object reference. This means, if you have another array to check against, you need to iterate it element by element. For this, you could use Array#findIndex
and iterate all elements with 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; }
您可以改用 .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
可以使用过滤功能
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)
您可以使用 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);
我有一个长度为 9 的数组。我想从数组中删除元素。
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)
为什么我的拼接不起作用?
无法使用Array#indexOf
with another object reference than the same object reference. This means, if you have another array to check against, you need to iterate it element by element. For this, you could use Array#findIndex
and iterate all elements with 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; }
您可以改用 .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
可以使用过滤功能
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)
您可以使用 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);