无法使用拼接移除元素

时间:2018-09-23 09:50:37

标签: javascript splice

我有一个长度为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)

为什么我的接头不起作用?

4 个答案:

答案 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);