Tengo lo siguiente para el bucle, y cuando lo uso splice()
para eliminar un elemento, obtengo que los 'segundos' no están definidos. Podría comprobar si no está definido, pero creo que probablemente haya una forma más elegante de hacerlo. El deseo es simplemente eliminar un elemento y continuar.
for (i = 0, len = Auction.auctions.length; i < len; i++) {
auction = Auction.auctions[i];
Auction.auctions[i]['seconds'] --;
if (auction.seconds < 0) {
Auction.auctions.splice(i, 1);
}
}
javascript
loops
dzm
fuente
fuente
Auction.auctions[i]['seconds']--
lugar deauction.seconds--
?Respuestas:
La matriz se vuelve a indexar cuando realiza un
.splice()
, lo que significa que omitirá un índice cuando se elimine uno, y su caché.length
está obsoleta.Para solucionarlo, deberías disminuir
i
después de a.splice()
, o simplemente iterar en reversa ...De esta manera, la reindexación no afecta el siguiente elemento de la iteración, ya que la indexación afecta solo a los elementos desde el punto actual hasta el final de la matriz, y el siguiente elemento de la iteración es inferior al punto actual.
fuente
Este es un problema bastante común. La solución es hacer un bucle hacia atrás:
No importa si los está sacando del final porque los índices se conservarán a medida que retrocede.
fuente
Vuelva a calcular la longitud cada vez a través del ciclo en lugar de solo al principio, por ejemplo:
De esa manera no superarás los límites.
EDITAR: se agregó una disminución en la instrucción if.
fuente
Aunque su pregunta es sobre la eliminación de elementos de la matriz que se está iterando y no sobre la eliminación eficiente de elementos (además de algún otro procesamiento), creo que uno debería reconsiderarlo si se encuentra en una situación similar.
La complejidad algorítmica de este enfoque es la
O(n^2)
función de empalme y el bucle for itera sobre la matriz (la función de empalme desplaza todos los elementos de la matriz en el peor de los casos). En su lugar, puede insertar los elementos necesarios en la nueva matriz y luego asignar esa matriz a la variable deseada (que se repitió).Desde ES2015 podemos usar
Array.prototype.filter
para ajustarlo todo en una línea:fuente
fuente
Si está utilizando ES6 +, ¿por qué no utilizar el método Array.filter?
Tenga en cuenta que modificar el elemento de matriz durante la iteración del filtro solo funciona para objetos y no funcionará para una matriz de valores primitivos.
fuente
Otra solución simple para digerir una matriz de elementos una vez:
fuente
Aquí hay otro ejemplo para el uso adecuado del empalme. Este ejemplo está a punto de eliminar 'atributo' de 'matriz'.
fuente
Para cada persona que ha respondido a esta pregunta muy básica con el código que tiene splice () en un bucle, que ha ejecutado el tiempo O (n 2 ), o que ha votado dicha respuesta, durante los siete años desde que se publicó esta pregunta: debe avergonzarse .
Aquí hay una solución de tiempo lineal simple para este problema de tiempo lineal simple.
Cuando ejecuto este fragmento, con n = 1 millón, cada llamada a filterInPlace () tarda .013 a .016 segundos. Una solución cuadrática (por ejemplo, la respuesta aceptada) tomaría un millón de veces más o menos.
Tenga en cuenta que esto modifica la matriz original en lugar de crear una nueva matriz; hacerlo de esta manera puede ser ventajoso, por ejemplo, en el caso de que la matriz sea el único cuello de botella de memoria del programa; en ese caso, no desea crear otra matriz del mismo tamaño, ni siquiera temporalmente.
fuente
Array.splice(i,1)
que crearía una nueva instancia de matriz cada vez. Estoy muy avergonzado.Ya hay muchas respuestas maravillosas en este hilo. Sin embargo, quería compartir mi experiencia cuando intenté resolver "eliminar el enésimo elemento de la matriz" en el contexto de ES5.
Las matrices de JavaScript tienen diferentes métodos para agregar / eliminar elementos desde el inicio o el final. Estos son:
Esencialmente, ninguno de los métodos anteriores se puede usar directamente para eliminar el enésimo elemento de la matriz.
Básicamente, esto nos deja con un solo método de matriz
Array.splice
para realizar la eliminación del enésimo elemento (también hay otras cosas que podría hacer con estos métodos, pero en el contexto de esta pregunta, me estoy centrando en la eliminación de elementos):Aquí está el código copiado de la respuesta original (con comentarios):
Otro método notable es
Array.slice
. Sin embargo, el tipo de retorno de este método son los elementos eliminados. Además, esto no modifica la matriz original. Fragmento de código modificado de la siguiente manera:Dicho esto, aún podemos usar
Array.slice
para eliminar el enésimo elemento como se muestra a continuación. Sin embargo, es mucho más código (por lo tanto, ineficiente)fuente
Intente retransmitir una matriz en newArray cuando realice un bucle:
fuente
Dos ejemplos que funcionan:
fuente
Prueba esto
fuente
fuente
Puedes mirar y usar
shift()
fuente