¿Cómo desarmo un elemento en una matriz en javascript?

138

¿Cómo elimino la clave 'barra' de una matriz para que la 'barra' no aparezca en

for(key in foo){alert(key);}
Steven Noble
fuente

Respuestas:

243

No use eliminar ya que no eliminará un elemento de una matriz, solo lo configurará como indefinido, lo que no se reflejará correctamente en la longitud de la matriz.

Si conoce la clave, debe usar empalme, es decir

myArray.splice(key, 1);

Para alguien en la posición de Steven puedes probar algo como esto:

for (var key in myArray) {
    if (key == 'bar') {
        myArray.splice(key, 1);
    }
}

o

for (var key in myArray) {
    if (myArray[key] == 'bar') {
        myArray.splice(key, 1);
    }
}
yendo
fuente
3
+1 Buen punto, también me gusta de esta manera: ejohn.org/blog/javascript-array-remove
CMS
3
@ThiefMaster - ¿Te gustaría explicarlo? No sé lo que eso significa y tengo ganas de aprender. Como siempre, una edición es 1,000,000 de veces mejor que un comentario fuera de lugar; debes saber eso con la cantidad de repeticiones que tienes.
partir del
21
Usar en for (var key in myArray)lugar de for (key in myArray): de lo contrario, keyes una variable global y si llama a una función dentro de ese ciclo que tiene el mismo problema, obtendrá resultados inesperados.
ThiefMaster
2
Tenga en cuenta que el segundo ejemplo no funciona si la matriz tiene varios elementos en una fila que coinciden con 'barra'. El índice de la matriz cambiará y perderá el empalme de la mitad de los elementos. En su lugar, use un bucle for que disminuya el índice cuando se encuentre una coincidencia.
Dave Lancea
Para una variedad de objetos: stackoverflow.com/questions/15287865/…
Fedir RYKHTIK
52
delete foo[key];

:RE


fuente
44
técnicamente eso no responde la pregunta. él está buscando eliminar la clave 'barra'. y su variable clave no implica eso. : P
Kon
44
clave = 'barra'; eval ("eliminar foo". + tecla); se esconde ; D
olliej
3
No NO utilizar eval. La eliminación de una clave / índice de un objeto / matriz se puede lograr mediante métodos mucho más simples que no se usan eval.
Dinei
44
En realidad, si elimina de la matriz indexada eliminando foo [clave], almacenará el valor en foo [clave] = undefined y foo.length seguirá siendo el mismo, lo cual es incorrecto. Así que use SPLICE en su lugar
Павел Иванов
use delete foo [key] es incorrecto; debe usar foo.splice (clave, 1);
vnguyen
38

Una nota importante: las matrices de JavaScript no son matrices asociativas como las que podría estar acostumbrado desde PHP. Si su "clave de matriz" es una cadena, ya no está operando en el contenido de una matriz. Su matriz es un objeto y está utilizando la notación de paréntesis para acceder al miembro llamado <nombre clave>. Así:

var myArray = [];
myArray ["bar"] = verdadero;
myArray ["foo"] = verdadero;
alerta (myArray.length); // devuelve 0.

Como no ha agregado elementos a la matriz, solo ha modificado los miembros de barra y foo de myArray.

John Factorial
fuente
37

Si conoce el nombre de la clave, simplemente haga lo siguiente:

delete array['key_name']
usuario3177525
fuente
2
¡Esto no es una matriz! Es un objeto (sí, se llaman matrices asociativas en JS, pero no, en realidad no lo son, y este método es perjudicial si realmente trabaja con una matriz JS).
wintercounter
3

Así es como lo haría

 myArray.splice( myArray.indexOf('bar') , 1) 
stackoverflows
fuente
1
El método Array.prototype.indexOf () busca un valor dentro de una matriz, no una clave. Entonces esto no funcionará.
Nadav