ADVERTENCIA : algunas de las respuestas más votadas pueden tener efectos secundarios, por ejemplo, realizar operaciones incorrectas cuando la matriz no contiene el elemento que se va a eliminar. Úselos con cuidado .
Esa es una buena noticia y sí, se necesitaba la modificación correcta :)
Sarfraz
2
Creo que la respuesta @ user113716, con respecto al método JS predeterminado, es la forma correcta. Cualquier método nativo siempre será preferido y más rápido.
neoswf
114
¿No es esta respuesta completamente incorrecta? Está creando una nueva matriz con un elemento faltante, no eliminando un elemento de la matriz. Esos no son lo mismo en absoluto.
James Moore
55
Esa es una eliminación con una complejidad de O (n) ... cuantos más valores en la matriz, peor será ...
Lyth
2
La complejidad de O (n) no es un problema.
Omar Tariq
370
Con jQuery, puede hacer una operación de una sola línea como esta:
@Elankeeran - De nada. : o) Debo señalar que esto eliminará solo la primera instancia. Si hay varios que eliminar, no funcionaría.
user113716
77
También cambié removeItem a un valor que NO existe en la matriz y eliminó el último elemento de la matriz. Use esto si no está seguro de la existencia del elemento eliminado: y = $ .grep (y, function (val) {return val! = RemoveItem;});
Solburn
52
ADVERTENCIA - ¡Puede eliminar el artículo incorrecto! $ .inArray devuelve -1 si el valor no está presente y .splice trata un índice negativo como 'desde el final', por lo que si el valor que está tratando de eliminar no está presente, se eliminará algún otro valor. También $ .grep eliminará todas las ocurrencias, mientras que este método solo eliminará el primero.
Ryan Williams el
1
Para solucionar los dos problemas descritos anteriormente, use un whilebucle y una variable temporal como esta:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
1
Aunque es mucho mejor con ES5 en .indexOf()lugar de jQuery porque puede usar el último índice encontrado como punto de partida para la próxima búsqueda, que es mucho más eficiente que buscar en toda la matriz cada vez. var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);
51
jQuery.filterEl método es útil. Esto está disponible para Arrayobjetos.
var arr =[1,2,3,4,5,5];var result = arr.filter(function(elem){return elem !=5;});//result -> [1,2,3,4]
Parece que funciona mejor con las soluciones propuestas, a pesar de que en realidad no está alterando la matriz existente, sino creando una nueva. También funciona con valores no existentes o una matriz vacía. Comprobación rápida del rendimiento en JSFiddle que hice: con una matriz con 800,000 valores tardó aproximadamente 6 segundos en completarse. Aunque no estoy seguro si eso es rápido.
Flo
2
Esta solución está utilizando el filtro de función de orden superior JS de vainilla, NO el método de filtro jQuery.
Kalimah
¡Me encanta! Parece la mejor solución a pesar de que no es jquery ...
Sam
36
Puedes usar underscore.js . Realmente hace las cosas simples.
En su caso, todo el código que tendrá que escribir es:
Array.prototype.remove=function(v){this.splice(this.indexOf(v)==-1?this.length :this.indexOf(v),1);}var a =['a','b','c'];
a.remove('c');//value of "a" is now ['a','b']
//This prototype function allows you to remove even array from arrayArray.prototype.remove=function(x){var i;for(i inthis){if(this[i].toString()== x.toString()){this.splice(i,1)}}}
¡Un poco más de explicación no pasaría por alto aquí!
Gaz Winter
Para utilizar esta función prototipo, debe pegarla en su código. Luego puede aplicarlo a cualquier matriz con 'notación de puntos', por ejemplo: someArr.remove ('elem1')
yesnik
3
El único problema con algo como esto es que sobrescribe el método de eliminación del objeto Array global, lo que significa que cualquier otro código en el proyecto que dependa del comportamiento predeterminado termina con un comportamiento defectuoso.
jmort253
2
Otro problema es que la variable global ise sobrescribe.
Roland Illig
5
No hay una forma nativa de hacer esto en Javascript. En su lugar, puede usar una biblioteca o escribir una pequeña función para hacer esto: http://ejohn.org/blog/javascript-array-remove/
Esto eliminará toda la matriz si el valor no está allí, por lo que searchValue = 4 devolverá una matriz en blanco.
Julian K
3
Copié el código en jsfiddle, cambié searchValuea 4, ejecuté el código, no se detectó ningún problema. Todos los valores todavía estaban presentes. @ JulianK
RST
4
Mi versión de la respuesta del usuario113716. Su elimina un valor si no se encuentra ninguna coincidencia, lo que no es bueno.
var y =[1,2,3]var removeItem =2;var i = $.inArray(removeItem,y)if(i >=0){
y.splice(i,1);}
alert(y);
Esto ahora elimina 1 elemento si se encuentra una coincidencia, 0 si no se encuentran coincidencias.
Cómo funciona:
$ .inArray (value, array) es una función jQuery que encuentra el primer índice de un value en unarray
Lo anterior devuelve -1 si no se encuentra el valor, así que verifique que sea un índice válido antes de realizar la eliminación. Eliminar el índice -1 significa eliminar el último, lo que no es útil aquí.
.splice (índice, número) elimina countnúmero de valores a partir de index, por lo que sólo queremos una countde las1
//in case somebody needs something like this: multidimensional array (two items)var ar =[[0,'a'],[1,'b'],[2,'c'],[3,'d'],[4,'e'],[5,'f']];var removeItem =3;
ar = jQuery.grep(ar,function(n){return n[0]!= removeItem;//or n[1] for second item in two item array});
ar;
Hay una solución simple con empalme. De acuerdo con W3School, la sintaxis de empalme es la siguiente;
array.splice(index, howmany, item1,....., itemX)
índice requerido. Un número entero que especifica en qué posición agregar / eliminar elementos. Utilice valores negativos para especificar la posición desde el final de la matriz.
cuántos requerido. El número de elementos que se eliminarán. Si se establece en 0, no se eliminarán elementos.
item1, ..., itemX Opcional. Los nuevos elementos que se agregarán a la matriz
Tenga en cuenta que los siguientes js mostrarán uno o más elementos coincidentes de la matriz dada si se encuentran, de lo contrario no eliminarían el último elemento de la matriz.
var x =[1,2,3,4,5,4,4,6,7];var item =4;var startItemIndex = $.inArray(item, x);var itemsFound = x.filter(function(elem){return elem == item;}).length;
O
var itemsFound = $.grep(x,function(elem){return elem == item;}).length;
ahora arriba de la línea eliminará este elemento de la matriz si se encuentra. Para resumir, la lógica a continuación es el código requerido para verificar y eliminar el elemento de la matriz.
/** SUBTRACT ARRAYS **/function subtractarrays(array1, array2){var difference =[];for(var i =0; i < array1.length; i++){if( $.inArray( array1[i], array2 )==-1){
difference.push(array1[i]);}}return difference;}
Luego puede llamar a la función en cualquier parte de su código.
var I_like =["love","sex","food"];var she_likes =["love","food"];
alert("what I like and she does't like is: "+ subtractarrays( I_like, she_likes ));//returns "Naughty :P"!
Esto funciona en todos los casos y evita los problemas en los métodos anteriores. ¡Espero que ayude!
La segunda respuesta más votada aquí está en la pista más cercana posible a un método jQuery de una línea del comportamiento deseado que el OP quiere, pero tropezaron al final de su código, y tiene una falla. Si su elemento a eliminar no está realmente en la matriz, se eliminará el último elemento.
Algunos han notado este problema, y algunos han ofrecido formas de recorrer para protegerse de esto. Ofrezco el método más corto y limpio que pude encontrar, y he comentado en su respuesta la forma de corregir su código de acuerdo con este método.
var x =[1,2,"bye",3,4];var y =[1,2,3,4];var removeItem ="bye";// Removing an item that exists in array
x.splice( $.inArray(removeItem,x), $.inArray(removeItem,x));// This is the one-liner used// Removing an item that DOESN'T exist in array
y.splice( $.inArray(removeItem,y), $.inArray(removeItem,y));// Same usage, different array// OUTPUT -- both cases are expected to be [1,2,3,4]
alert(x +'\n'+ y);
La matriz x eliminará el elemento "adiós" fácilmente, y la matriz y quedará intacta.
El uso del argumento $.inArray(removeItem,array)como segundo argumento en realidad termina siendo la longitud para empalmar. Dado que no se encontró el elemento, esto se evalúa como array.splice(-1,-1);, lo que simplemente dará como resultado que no se empalme nada ... todo sin tener que escribir un bucle para esto.
Para eliminar de forma segura 2 de la matriz usando JavaScript vainilla:
// Define polyfill for browsers that don't natively support Array.indexOf()if(!Array.prototype.indexOf){Array.prototype.indexOf =function(searchElement, fromIndex){var k;if(this===null){thrownewTypeError('"this" is null or not defined');}var O =Object(this),
len = O.length >>>0;if(len===0)return-1;var n =+fromIndex ||0;if(Math.abs(n)===Infinity) n =0;if(n >= len)return-1;
k =Math.max(n >=0? n : len -Math.abs(n),0);while(k < len){if(k in O && O[k]===searchElement)return k;++k;}return-1;};}// Remove first instance of 2 from arrayif(y.indexOf(2)>-1){
y.splice(y.indexOf(2),1);}/* To remove all instances of 2 from array, change 'if' to 'while':
while (y.indexOf(2) > -1) {
y.splice(y.indexOf(2), 1);
}
*/
console.log(y);// Returns [1, 3]
Respuestas:
Un JSFIDDLE que funciona
Puedes hacer algo como esto:
Resultado:
http://snipplr.com/view/14381/remove-item-from-array-with-jquery/
fuente
Con jQuery, puede hacer una operación de una sola línea como esta:
Ejemplo: http://jsfiddle.net/HWKQY/
Usa el nativo
.splice()
y jQuery's$.inArray()
.fuente
while
bucle y una variable temporal como esta:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
.indexOf()
lugar de jQuery porque puede usar el último índice encontrado como punto de partida para la próxima búsqueda, que es mucho más eficiente que buscar en toda la matriz cada vez.var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);
jQuery.filter
El método es útil. Esto está disponible paraArray
objetos.http://jsfiddle.net/emrefatih47/ar0dhvhw/
En Ecmascript 6:
https://jsfiddle.net/emrefatih47/nnn3c2fo/
fuente
Puedes usar underscore.js . Realmente hace las cosas simples.
En su caso, todo el código que tendrá que escribir es:
y el resultado será [1,3].
Reduce el código que escribes.
fuente
No es una forma jQuery pero ... ¿Por qué no usar una forma más simple? Eliminar 'c' de la siguiente matriz
También puede usar: (Nota para mí: no modifique objetos que no le pertenecen )
Agregar es más simple
a.push('c')
fuente
Eliminar elemento en matriz
fuente
Ejemplo de uso
Para utilizar esta función prototipo, debe pegarla en su código. Luego puede aplicarlo a cualquier matriz con 'notación de puntos':
fuente
i
se sobrescribe.No hay una forma nativa de hacer esto en Javascript. En su lugar, puede usar una biblioteca o escribir una pequeña función para hacer esto: http://ejohn.org/blog/javascript-array-remove/
fuente
Puede usar .not funciona así:
fuente
searchValue
a 4, ejecuté el código, no se detectó ningún problema. Todos los valores todavía estaban presentes. @ JulianKMi versión de la respuesta del usuario113716. Su elimina un valor si no se encuentra ninguna coincidencia, lo que no es bueno.
Esto ahora elimina 1 elemento si se encuentra una coincidencia, 0 si no se encuentran coincidencias.
Cómo funciona:
value
en unarray
count
número de valores a partir deindex
, por lo que sólo queremos unacount
de las1
fuente
fuente
Hay una solución simple con empalme. De acuerdo con W3School, la sintaxis de empalme es la siguiente;
índice requerido. Un número entero que especifica en qué posición agregar / eliminar elementos. Utilice valores negativos para especificar la posición desde el final de la matriz.
cuántos requerido. El número de elementos que se eliminarán. Si se establece en 0, no se eliminarán elementos.
item1, ..., itemX Opcional. Los nuevos elementos que se agregarán a la matriz
Tenga en cuenta que los siguientes js mostrarán uno o más elementos coincidentes de la matriz dada si se encuentran, de lo contrario no eliminarían el último elemento de la matriz.
O
Entonces la final debería verse como la siguiente
Espero que esto ayude.
fuente
fuente
Tuve una tarea similar en la que necesitaba eliminar varios objetos a la vez en función de una propiedad de los objetos en la matriz.
Entonces, después de algunas iteraciones, termino con:
fuente
Extendería la clase Array con una
pick_and_remove()
función, así:Si bien puede parecer un poco detallado, ¡ahora puede recurrir
pick_and_remove()
a cualquier matriz que desee!Uso:
Puedes ver todo esto en acción con temática de pokemon aquí.
fuente
Luego puede llamar a la función en cualquier parte de su código.
Esto funciona en todos los casos y evita los problemas en los métodos anteriores. ¡Espero que ayude!
fuente
Prueba esto, me funciona
fuente
La segunda respuesta más votada aquí está en la pista más cercana posible a un método jQuery de una línea del comportamiento deseado que el OP quiere, pero tropezaron al final de su código, y tiene una falla. Si su elemento a eliminar no está realmente en la matriz, se eliminará el último elemento.
Algunos han notado este problema, y algunos han ofrecido formas de recorrer para protegerse de esto. Ofrezco el método más corto y limpio que pude encontrar, y he comentado en su respuesta la forma de corregir su código de acuerdo con este método.
La matriz x eliminará el elemento "adiós" fácilmente, y la matriz y quedará intacta.
El uso del argumento
$.inArray(removeItem,array)
como segundo argumento en realidad termina siendo la longitud para empalmar. Dado que no se encontró el elemento, esto se evalúa comoarray.splice(-1,-1);
, lo que simplemente dará como resultado que no se empalme nada ... todo sin tener que escribir un bucle para esto.fuente
Para eliminar de forma segura 2 de la matriz usando JavaScript vainilla:
Fuente de Polyfill: Mozilla
fuente
Solo para agregar a la respuesta de Sarfraz, sorprendido de que nadie lo haya convertido en una función todavía.
Use la respuesta de ddagsan usando el método .filter si tiene el mismo valor más de una vez en su matriz.
fuente