Удалить массив из массива на основе индекса в JS - PullRequest
2 голосов
/ 09 июля 2019

У меня есть массив, который выглядит следующим образом: -

[[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 ]

5 голосов
/ 09 июля 2019

Вы не можете использовать 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 голос
/ 09 июля 2019

Если можно удалить все вхождения [0,3], рассмотрите Array.filter в сочетании с деструктуризацией массива лямбда-аргументов. Он предлагает немного более тонкий синтаксис, чем другие решения.

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 голосов
/ 09 июля 2019

Чтобы объяснить, почему ваше решение не будет работать:

Операторы сравнения работают только для значений, не переданных ссылкой.При работе со ссылками операторы сравнения всегда возвращают 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

Чтобы дать вам решение (заимствует у здесь )

//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
...