根据JS中的索引从数组内部删除数组

时间:2019-07-08 22:24:22

标签: javascript arrays array-splice

我有一个看起来像这样的数组:-

[[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);

有人能够指出正确的方向来帮助解决我遇到的这个问题吗?

谢谢。

3 个答案:

答案 0 :(得分:5)

您不能使用indexOf,因为在[0,3]中声明array.splice(array.indexOf([0,3]), 1))时,您正在创建一个新数组,并且此新对象不在array内部(但是而不是另一个具有相同值的数组。

您可以改为使用findIndex,如下所示(示例):

array.findIndex(x => x[0] === 0 && x[1] === 3)

这将返回2-现在您可以使用它来删除:

array.splice(2, 1)

答案 1 :(得分:1)

如果可以删除每次出现的[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);

答案 2 :(得分:0)

解释为什么您的解决方案不起作用:

比较运算符仅适用于引用未传递的值。处理引用时,比较运算符始终返回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