Estoy tratando de iterar una matriz con forEach y, según una condición, hago algo.

Para esta pregunta, simplifiqué la condición para tratar de entender lo que está sucediendo.

Espero la matriz b = [] después de la operación, pero no lo es, ya que opera solo a la mitad en los elementos. ¿Por qué pasó esto?

(No se trata de eliminar todo de b, solo de tratar de entender por qué salta los índices pares).

var a = [1, 2, 3, 4, 5, 6];
var b = a.slice(0);

console.log('before b = ', b); // b = [1, 2, 3, 4, 5, 6]

a.forEach(function (e) {
    if (e > 0) {
        b.splice(a.indexOf(e), 1);
    }
});


console.log('after b = ', b); // b = [2, 4, 6]

// but I expect b = []
2
DonJoe 4 mar. 2018 a las 19:27

3 respuestas

La mejor respuesta

No es asi. Pasa por todos y cada uno de los elementos. La cosa es lo que haces con la matriz b. Primero eliminas el índice 0, que es 1. Entonces ahora b = [2,3,4,5,6]. Luego indexe 1, que es 3, entonces b = [2,4,5,6]. Luego indexe 2, que es 5, entonces b = [2,4,6]. Los siguientes índices no existen, así que al final b = [2,4,6].

Para obtener el resultado esperado, use b.indexOf(e) en su llamada de empalme.

var a = [1, 2, 3, 4, 5, 6];
var b = a.slice(0);

console.log('before b = ', b); // b = [1, 2, 3, 4, 5, 6]

a.forEach(function (e) {
    if (e > 0) {
        b.splice(b.indexOf(e), 1);
    }
});


console.log('after b = ', b); // b = [2, 4, 6]

// but I expect b = []
3
Giannis Mp 4 mar. 2018 a las 16:37

Puede tomar el índice directamente para empalmar y hacer un registro del valor de la matriz. Usted ve que la matriz se vuelve más pequeña que el índice de empalme.

var a = [1, 2, 3, 4, 5, 6];
var b = a.slice(0);

console.log(b.join(' '));

a.forEach(function (e, i) {
    if (e > 0) {
        b.splice(a.indexOf(e), 1);
        console.log(i, ': ', b.join(' '));
    }
});

console.log(b); // b = [2, 4, 6]

Para vaciar b, debe buscar el índice de la matriz b, no a y empalmarlo.

var a = [1, 2, 3, 4, 5, 6];
var b = a.slice(0);

a.forEach(function (e, i) {
    if (e > 0) {
        b.splice(b.indexOf(e), 1);
        //       ^
    }
});

console.log(b);
2
Nina Scholz 4 mar. 2018 a las 16:35

Estás empalmando según el índice del elemento de a, sin embargo, los índices de b se actualizan cuando lo empalmas. Debe intentar empalmar desde b en función del índice del elemento IN b.

1
Alex 4 mar. 2018 a las 16:39