Encuentre el index
elemento de matriz que desea eliminar con indexOf
, y luego elimine ese índice con splice
.
El método splice () cambia el contenido de una matriz al eliminar elementos existentes y / o agregar nuevos elementos.
const array = [2, 5, 9];
console.log(array);
const index = array.indexOf(5);
if (index > -1) {
array.splice(index, 1);
}
// array = [2, 9]
console.log(array);
El segundo parámetro de splice
es el número de elementos a eliminar. Tenga en cuenta que splice
modifica la matriz en su lugar y devuelve una nueva matriz que contiene los elementos que se han eliminado.
Por razones de integridad, aquí hay funciones. Primera función elimina sólo sola ocurrencia (es decir, la eliminación de primer partido de 5
de [2,5,9,1,5,8,5]
), mientras que segunda función elimina todas las apariciones:
function removeItemOnce(arr, value) {
var index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}
function removeItemAll(arr, value) {
var i = 0;
while (i < arr.length) {
if(arr[i] === value) {
arr.splice(i, 1);
} else {
++i;
}
}
return arr;
}
array.indexOf(testValue)
en una matriz vacía será -1, y si está probando eso, entonces no hay empalme. Tal vez la respuesta ha cambiado desde entonces.No sé cómo esperas
array.remove(int)
comportarte. Hay tres posibilidades que puedo pensar que podrías desear.Para eliminar un elemento de una matriz en un índice
i
:Si desea eliminar todos los elementos con valor
number
de la matriz:Si solo desea que el elemento en el índice
i
ya no exista, pero no desea que cambien los índices de los otros elementos:fuente
delete
¡No es la forma correcta de eliminar un elemento de una matriz!array.hasOwnProperty(i)
regresefalse
y que el elemento en esa posición regreseundefined
. Pero admito que no es algo muy común querer hacer.delete
no actualizará la longitud de la matriz ni borrará realmente el elemento, solo lo reemplazará con el valor especialundefined
.undefined
: elimina tanto el índice como el valor de la matriz, es decirdelete array[0]
, después ,"0" in array
devolverá falso.delete
hacer a entender por qué no funciona como esperan.Editado en octubre de 2016
En este ejemplo de código, uso la función "array.filter (...)" para eliminar elementos no deseados de una matriz. Esta función no cambia la matriz original y crea una nueva. Si su navegador no es compatible con esta función (por ejemplo, Internet Explorer antes de la versión 9 o Firefox antes de la versión 1.5), considere usar el polyfill de filtro de Mozilla .
Eliminando elemento (código ECMA-262 Edición 5, también conocido como JavaScript de estilo antiguo)
Eliminando elemento (código ECMAScript 6)
IMPORTANTE La sintaxis de la función de flecha ECMAScript 6 "() => {}" no es compatible en absoluto con Internet Explorer, Chrome antes de la versión 45, Firefox antes de la versión 22 y Safari antes de la versión 10. Para usar la sintaxis de ECMAScript 6 en navegadores antiguos, puede usar BabelJS .
Eliminar varios elementos (código ECMAScript 7)
Una ventaja adicional de este método es que puede eliminar varios elementos
IMPORTANTE: la función "array.includes (...)" no es compatible en absoluto con Internet Explorer, Chrome antes de la versión 47, Firefox antes de la versión 43, Safari antes de la versión 9 y Edge antes de la versión 14, así que aquí hay polyfill de Mozilla .
Eliminar múltiples elementos (en el futuro, tal vez)
Si alguna vez se acepta la propuesta de "esta sintaxis vinculante" , podrá hacer esto:
Pruébalo tú mismo en BabelJS :)
Referencia
fuente
filter
¿debe ser mucho más lento para una gran variedad?filter
puede tener un rendimiento más lento, pero es un código más seguro y mejor. Además, puede filtrar por índice especificando un segundo argumento en la lambda:arr.filter((x,i)=>i!==2)
Depende de si quieres mantener un espacio vacío o no.
Si desea un espacio vacío, eliminar está bien:
Si no lo hace, debe usar el método de empalme :
Y si necesita el valor de ese elemento, puede almacenar el elemento de la matriz devuelta:
En caso de que desee hacerlo en algún orden, puede usarlo
array.pop()
para el último oarray.shift()
para el primero (y ambos devuelven el valor del artículo también).Y si no conoce el índice del elemento, puede usarlo
array.indexOf(item)
para obtenerlo (if()
para obtener un elemento owhile()
para obtener todos).array.indexOf(item)
devuelve el índice o -1 si no se encuentra.fuente
delete
¡No es la forma correcta de eliminar un elemento de una matriz!array[index] = undefined;
. El usodelete
destruirá la optimización.Un amigo tenía problemas en Internet Explorer 8 y me mostró lo que hizo. Le dije que estaba mal, y él me dijo que tenía la respuesta aquí. La respuesta principal actual no funcionará en todos los navegadores (por ejemplo, Internet Explorer 8) y solo eliminará la primera aparición del elemento.
Eliminar TODAS las instancias de una matriz
Recorre la matriz hacia atrás (ya que los índices y la longitud cambiarán a medida que se eliminan los elementos) y elimina el elemento si se encuentra. Funciona en todos los navegadores.
fuente
i = arr.length -1
oi--
es igual al índice máximo.arr.length
es solo un valor inicial parai
.i--
siempre será verdadero (y se reducirá en 1 en cada ciclo op) hasta que sea igual0
(un valor falso) y el ciclo se detendrá.arr.filter(function (el) { return el !== item })
, evitando la necesidad de mutar la matriz varias veces. Esto consume un poco más de memoria, pero funciona de manera mucho más eficiente, ya que hay menos trabajo por hacer.Hay dos enfoques principales:
empalme () :
anArray.splice(index, 1);
eliminar :
delete anArray[index];
Tenga cuidado cuando use eliminar para una matriz. Es bueno para eliminar atributos de objetos, pero no tan bueno para matrices. Es mejor usarlo
splice
para matrices.Tenga en cuenta que cuando usa
delete
una matriz puede obtener resultados incorrectosanArray.length
. En otras palabras,delete
eliminaría el elemento, pero no actualizaría el valor de la propiedad de longitud.También puede esperar tener agujeros en los números de índice después de usar eliminar, por ejemplo, podría terminar teniendo los índices 1, 3, 4, 8, 9 y 11 y la longitud que tenía antes de usar eliminar. En ese caso, todos los
for
bucles indexados se bloquearían, ya que los índices ya no son secuenciales.Si se ve obligado a usarlo
delete
por algún motivo, debe usarfor each
bucles cuando necesite recorrer los arreglos. De hecho, evite siempre usarfor
bucles indexados , si es posible. De esa forma, el código sería más robusto y menos propenso a problemas con los índices.fuente
fuente
for in
en una matriz, ya tiene un problema.for in
en matrices, ya tiene problemas más grandes.No hay necesidad de usar
indexOf
osplice
. Sin embargo, funciona mejor si solo desea eliminar una aparición de un elemento.Buscar y mover (mover):
Uso
indexOf
ysplice
(indexof):Usar solo
splice
(empalme):Tiempos de ejecución en nodejs para una matriz con 1000 elementos (promedio de más de 10000 ejecuciones):
indexof es aproximadamente 10 veces más lento que el movimiento . Incluso si mejorado mediante la eliminación de la llamada a la
indexOf
de empalme se realiza mucho peor que el movimiento .fuente
Esto proporciona un predicado en lugar de un valor.
NOTA: actualizará la matriz dada y devolverá las filas afectadas.
Uso
Definición
fuente
Puede hacerlo fácilmente con el método de filtro :
Esto elimina todos los elementos de la matriz y también funciona más rápido que una combinación de
slice
yindexOf
.fuente
John Resig publicó una buena implementación :
Si no desea extender un objeto global, puede hacer algo como lo siguiente:
Pero la razón principal por la que estoy publicando esto es para advertir a los usuarios contra la implementación alternativa sugerida en los comentarios en esa página (14 de diciembre de 2007):
Al principio parece funcionar bien, pero a través de un proceso doloroso descubrí que falla al intentar eliminar el penúltimo elemento de una matriz. Por ejemplo, si tiene una matriz de 10 elementos e intenta eliminar el noveno elemento con esto:
Terminas con una matriz de 8 elementos. No sé por qué, pero he confirmado que la implementación original de John no tiene este problema.
fuente
Object.prototype.hasOwnProperty
siempre ¬¬Underscore.js se puede usar para resolver problemas con varios navegadores. Utiliza métodos de navegador integrados si están presentes. Si están ausentes, como en el caso de versiones anteriores de Internet Explorer, utiliza sus propios métodos personalizados.
Un ejemplo simple para eliminar elementos de la matriz (del sitio web):
fuente
Puedes usar ES6. Por ejemplo, para eliminar el valor '3' en este caso:
Salida:
fuente
Si desea una nueva matriz con las posiciones eliminadas eliminadas, siempre puede eliminar el elemento específico y filtrar la matriz. Es posible que necesite una extensión del objeto de matriz para los navegadores que no implementan el método de filtro, pero a largo plazo es más fácil ya que todo lo que hace es esto:
Debería mostrar
[1, 2, 3, 4, 6]
.fuente
Mira este código. Funciona en todos los principales navegadores .
Llamar a esta función
fuente
for in
bucle y el hecho de que el script podría detenerse antes, devolviendo el resultado directamente del bucle. Los votos a favor son razonables;)for( i = 0; i < arr.length; i++ )
sería un mejor enfoque, ya que conserva los índices exactos en comparación con el orden en que el navegador decida almacenar los elementos (confor in
). Hacerlo también le permite obtener el índice de matriz de un valor si lo necesita.Puede usar lodash _.pull ( mutate array), _.pullAt ( mutate array) o _.without (no mutate array),
fuente
ES6 y sin mutación: (octubre de 2016)
fuente
filter
entonces?array.filter((_, index) => index !== removedIndex);
.La eliminación de un elemento / cadena particular de una matriz se puede hacer de una sola línea:
dónde:
theArray : la matriz de la que desea eliminar algo en particular
stringToRemoveFromArray : la cadena que desea eliminar y 1 es la cantidad de elementos que desea eliminar.
NOTA : Si "stringToRemoveFromArray" no se encuentra en su matriz, esto eliminará el último elemento de la matriz.
Siempre es una buena práctica verificar si el elemento existe primero en su matriz, antes de eliminarlo.
Si tiene acceso a las nuevas versiones de Ecmascript en las computadoras de su cliente (ADVERTENCIA, puede no funcionar en estaciones más antiguas):
Donde '3' es el valor que desea eliminar de la matriz. La matriz se convertiría en:
['1','2','4','5','6']
fuente
"stringToRemoveFromArray"
no está ubicado en su matriz, esto eliminará el último elemento de la matriz.Aquí hay algunas maneras de eliminar un elemento de una matriz usando JavaScript .
Todos los métodos descritos no mutan la matriz original y, en cambio, crean una nueva.
Si conoce el índice de un artículo
Supongamos que tiene una matriz y desea eliminar un elemento en posición
i
.Un método es usar
slice()
:slice()
crea una nueva matriz con los índices que recibe. Simplemente creamos una nueva matriz, desde el inicio hasta el índice que queremos eliminar, y concatenamos otra matriz desde la primera posición que sigue a la que eliminamos hasta el final de la matriz.Si sabes el valor
En este caso, una buena opción es usar
filter()
, que ofrece un enfoque más declarativo :Esto utiliza las funciones de flecha ES6. Puede usar las funciones tradicionales para admitir navegadores antiguos:
o puede usar Babel y volver a compilar el código ES6 a ES5 para que sea más digerible para los navegadores antiguos, y aún así escribir JavaScript moderno en su código.
Eliminar múltiples elementos
¿Qué sucede si, en lugar de un solo elemento, desea eliminar muchos elementos?
Encontremos la solución más simple.
Por índice
Simplemente puede crear una función y eliminar elementos en serie:
Por valor
Puede buscar la inclusión dentro de la función de devolución de llamada:
Evite mutar la matriz original.
splice()
(no debe confundirse conslice()
) muta la matriz original y debe evitarse.(publicado originalmente en https://flaviocopes.com/how-to-remove-item-from-array/ )
fuente
OK, por ejemplo, tienes la siguiente matriz:
Y queremos eliminar el número 4. Simplemente puede usar el siguiente código:
Si está reutilizando esta función, escriba una función reutilizable que se adjuntará a la función de matriz nativa como se muestra a continuación:
Pero, ¿qué tal si tiene la siguiente matriz en su lugar con algunos [5] s en la matriz?
Necesitamos un bucle para verificarlos todos, pero una manera más fácil y eficiente es usar funciones de JavaScript incorporadas, por lo que escribimos una función que usa un filtro como el siguiente:
También hay bibliotecas de terceros que lo ayudan a hacer esto, como Lodash o Underscore. Para obtener más información, mire lodash _.pull, _.pullAt o _.without.
fuente
this.splice(num.indexOf(x), 1);
=>this.splice(this.indexOf(x), 1);
Soy bastante nuevo en JavaScript y necesitaba esta funcionalidad. Simplemente escribí esto:
Entonces cuando quiero usarlo:
Salida: como se esperaba. ["item1", "item1"]
Es posible que tenga necesidades diferentes que yo, por lo que puede modificarlo fácilmente para adaptarlo a ellas. Espero que esto ayude a alguien.
fuente
Si tiene objetos complejos en la matriz, ¿puede usar filtros? En situaciones donde $ .inArray o array.splice no es tan fácil de usar. Especialmente si los objetos son quizás poco profundos en la matriz.
Por ejemplo, si tiene un objeto con un campo Id y desea eliminar el objeto de una matriz:
fuente
Quiero responder basado en ECMAScript 6 . Supongamos que tiene una matriz como la siguiente:
Si desea eliminar en un índice especial como
2
, escriba el siguiente código:Pero si desea eliminar un elemento especial como
3
y no conoce su índice, haga lo siguiente:Sugerencia : utilice una función de flecha para la devolución de llamada del filtro a menos que obtenga una matriz vacía.
fuente
Actualización: este método se recomienda solo si no puede usar ECMAScript 2015 (anteriormente conocido como ES6). Si puede usarlo, otras respuestas aquí proporcionan implementaciones mucho más ordenadas.
Esta esencia aquí resolverá su problema y también elimina todas las apariciones del argumento en lugar de solo 1 (o un valor especificado).
Uso:
fuente
Actuación
Hoy (09-12-2019) realizo pruebas de rendimiento en macOS v10.13.6 (High Sierra) para las soluciones elegidas. Muestro
delete
(A), pero no lo uso en comparación con otros métodos, porque dejó un espacio vacío en la matriz.Las conclusiones
array.splice
(C) (excepto Safari para arreglos pequeños donde tiene la segunda vez)array.slice+splice
(H) es la solución inmutable más rápida para Firefox y Safari;Array.from
(B) es el más rápido en ChromeDetalles
En las pruebas elimino el elemento medio de la matriz de diferentes maneras. Las soluciones A, C están en su lugar. Las soluciones B, D, E, F, G, H son inmutables.
Resultados para matriz con 10 elementos
En Chrome, la
array.splice
(C) es la solución más rápida en el lugar. Laarray.filter
(D) es la solución inmutable más rápida. El más lento esarray.slice
(F). Puede realizar la prueba en su máquina aquí .Resultados para matriz con 1.000.000 de elementos.
En Chrome, la
array.splice
(C) es la solución más rápida en el lugar (ladelete
(C) es similar rápidamente, pero dejó una ranura vacía en la matriz (por lo que no realiza una 'eliminación completa')). Laarray.slice-splice
(H) es la solución inmutable más rápida. El más lento esarray.filter
(D y E). Puede realizar la prueba en su máquina aquí .Mostrar fragmento de código
Comparación para navegadores: Chrome v78.0.0, Safari v13.0.4 y Firefox v71.0.0
fuente
Nunca debe mutar su matriz. Como esto va en contra del patrón de programación funcional. Puede crear una nueva matriz sin hacer referencia a la matriz de la que desea cambiar los datos utilizando el método ECMAScript 6
filter
;Supongamos que desea eliminar
5
de la matriz, simplemente puede hacerlo así:Esto le dará una nueva matriz sin el valor que desea eliminar. Entonces el resultado será:
Para una mejor comprensión, puede leer la documentación de MDN en Array.filter .
fuente
Un enfoque más moderno, ECMAScript 2015 (anteriormente conocido como Harmony o ES 6). Dado:
Entonces:
Flexible:
Puede usar Babel y un servicio polyfill para asegurarse de que esto sea compatible con todos los navegadores.
fuente
.filter
devuelve una nueva matriz, que no es exactamente lo mismo que eliminar el elemento de la misma matriz. El beneficio de este enfoque es que puede encadenar métodos de matriz juntos. por ejemplo:[1,2,3].filter(n => n%2).map(n => n*n) === [ 1, 9 ]
splice
oslice
.items= items.filter(x=>x!=3)
. Además, el OP no estableció ningún requisito para un gran conjunto de datos.Tiene de 1 a 9 en la matriz y desea eliminar 5. Use el siguiente código:
Si quieres múltiples valores. Ejemplo: - 1,7,8
Si desea eliminar un valor de matriz en una matriz. Ejemplo: [3,4,5]
Incluye navegador compatible es enlace .
fuente
Sé que ya hay muchas respuestas, pero muchas de ellas parecen complicar demasiado el problema. Aquí hay una manera simple y recursiva de eliminar todas las instancias de una clave: se llama a sí mismo hasta que no se encuentra el índice. Sí, solo funciona en navegadores
indexOf
, pero es simple y se puede rellenar fácilmente.Función independiente
Método de prototipo
fuente
Puede hacer un bucle hacia atrás para asegurarse de no arruinar los índices, si hay varias instancias del elemento.
Demo en vivo
fuente