根据JS中的索引从数组内部删除数组
Remove array from inside array based on index in JS
我有一个数组,看起来像:-
[[0,1], [0,2], [0,3], [1,1], [1,2]...]
我想根据 indexOf()
从这个数组中删除一个数组,但我一直得到 -1
的值,当我尝试以下代码:-
array = [[0,1], [0,2], [0,3], [1,1], [1,2]];
console.log('Removed value', array.splice(array.indexOf([0,3]), 1));
console.log('Result', array);
有人能给我指出正确的方向来帮助解决我遇到的这个问题吗?
提前致谢。
您不能使用 indexOf
,因为当您在 array.splice(array.indexOf([0,3]), 1))
中声明 [0,3]
时,您正在创建一个新数组,而这个新对象不在您的 array
中(而是另一个具有相同值的数组)。
您可以使用 findIndex
代替(示例):
array.findIndex(x => x[0] === 0 && x[1] === 3)
这将 return 2
- 现在您可以使用它来删除:
array.splice(2, 1)
解释为什么你的解决方案不起作用:
比较运算符仅适用于未通过引用传递的值。在处理引用时,比较运算符总是return false,除非两个引用指向同一个对象。 (见 MDN)
一个例子:
a = [0,1]
b = a
b === a //true. a and b point to the same array.
a === [0,1] //false. a points to a different array than [0,1]
b[0] = 2
a[0] //2 - b points to the same array as a
给你一个解决方案(借用here)
//Function to compare the values inside the arrays, and determine if they are equal.
//Note: does not recurse.
function arraysEqual(arr1, arr2) {
if(arr1.length !== arr2.length)
return false;
for(var i = arr1.length; i--;) {
if(arr1[i] !== arr2[i])
return false;
}
return true;
}
array = [[0,1], [0,2], [0,3], [1,1], [1,2]];
//Find the index where x has the same values as [0,3]
array.findIndex(x => arraysEqual(x, [0,3])) //2
如果可以删除每个出现的 [0,3]
,则考虑将 Array.filter
与 lambda 参数的数组解构相结合。它提供了比其他解决方案稍微精简的语法。
const input = [
[0,1],
[0,2],
[0,3],
[1,1],
[1,2]
];
const result = input.filter(([x,y]) => !(x==0 && y==3));
console.log('Result=', result);
我有一个数组,看起来像:-
[[0,1], [0,2], [0,3], [1,1], [1,2]...]
我想根据 indexOf()
从这个数组中删除一个数组,但我一直得到 -1
的值,当我尝试以下代码:-
array = [[0,1], [0,2], [0,3], [1,1], [1,2]];
console.log('Removed value', array.splice(array.indexOf([0,3]), 1));
console.log('Result', array);
有人能给我指出正确的方向来帮助解决我遇到的这个问题吗?
提前致谢。
您不能使用 indexOf
,因为当您在 array.splice(array.indexOf([0,3]), 1))
中声明 [0,3]
时,您正在创建一个新数组,而这个新对象不在您的 array
中(而是另一个具有相同值的数组)。
您可以使用 findIndex
代替(示例):
array.findIndex(x => x[0] === 0 && x[1] === 3)
这将 return 2
- 现在您可以使用它来删除:
array.splice(2, 1)
解释为什么你的解决方案不起作用:
比较运算符仅适用于未通过引用传递的值。在处理引用时,比较运算符总是return false,除非两个引用指向同一个对象。 (见 MDN)
一个例子:
a = [0,1]
b = a
b === a //true. a and b point to the same array.
a === [0,1] //false. a points to a different array than [0,1]
b[0] = 2
a[0] //2 - b points to the same array as a
给你一个解决方案(借用here)
//Function to compare the values inside the arrays, and determine if they are equal.
//Note: does not recurse.
function arraysEqual(arr1, arr2) {
if(arr1.length !== arr2.length)
return false;
for(var i = arr1.length; i--;) {
if(arr1[i] !== arr2[i])
return false;
}
return true;
}
array = [[0,1], [0,2], [0,3], [1,1], [1,2]];
//Find the index where x has the same values as [0,3]
array.findIndex(x => arraysEqual(x, [0,3])) //2
如果可以删除每个出现的 [0,3]
,则考虑将 Array.filter
与 lambda 参数的数组解构相结合。它提供了比其他解决方案稍微精简的语法。
const input = [
[0,1],
[0,2],
[0,3],
[1,1],
[1,2]
];
const result = input.filter(([x,y]) => !(x==0 && y==3));
console.log('Result=', result);