2010-08-29 26 views
352

tengo una matriz que tiene este aspecto: var y = [1, 2, 3];Cómo quitar valor específico de la matriz usando jQuery

quisiera eliminar 2 de la matriz y.

¿Cómo puedo eliminar un valor particular de una matriz usando jQuery? He intentado pop() pero eso siempre elimina el último elemento.

+6

** ** ADVERTENCIA: algunas de las respuestas más upvoted podría tener efectos secundarios, por ejemplo, haciendo operaciones incorrectas cuando la matriz no contiene el elemento a eliminar. * Utilícelos con cuidado *. – Ricardo

+0

Esta respuesta funcionó para mí, con javascript simple: http://stackoverflow.com/a/5767357/4681687 – chimos

Respuesta

514

Un trabajo

se puede hacer algo como esto:

var y = [1, 2, 2, 3, 2] 
var removeItem = 2; 

y = jQuery.grep(y, function(value) { 
    return value != removeItem; 
}); 

Resultado:

[1, 3] 

http://snipplr.com/view/14381/remove-item-from-array-with-jquery/

+0

Gracias Sarfraz misma respuesta que obtuve de http://snipplr.com/view/14381/remove-item-from- array-with-jquery/ ¡Está trabajando ahora! Gracias. – Elankeeran

+2

Es una buena noticia y sí, se necesitaba la modificación correcta :) – Sarfraz

+2

tiene un error en la función (valor) ")". – tftd

322

con jQuery, se puede hacer una operación de una sola línea como esta:

Ejemplo:http://jsfiddle.net/HWKQY/

y.splice($.inArray(removeItem, y), 1); 

Utiliza el .splice() nativo y el $.inArray() de jQuery.

+11

@Elankeeran - De nada. : o) Debo señalar que esto eliminará solo la primera instancia. Si hay varios que eliminar, no funcionaría. – user113716

+7

También cambié el 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

+0

También es bueno tener en cuenta que si conoce el índice del elemento, puede eliminarlo simplemente usando '.splice (1, 1)', donde la primera expresión es el índice y la segunda es la cantidad que debe eliminar en ese índice. Entonces, para eliminar 2, sabría que está en el índice 1. 'y.splice (1, 1);' http://msdn.microsoft.com/en-us/library/wctc5k7s%28v=VS.94%29 .aspx –

27

No es una manera jQuery, pero ... ¿Por qué no utilizar de manera más simple. Quitar 'c' del siguiente matriz

var a = ['a','b','c','d'] 
a.splice(a.indexOf('c'),1); 
>["c"] 
a 
["a", "b", "d"] 

También puede utilizar: (Nota para mí misma: Don’t modify objects you don’t own)

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'] 

La adición es más simple a.push('c')

+6

No funciona. Elimina el último elemento de la matriz si no se encuentra. –

+6

indexOf no es compatible con IE8-. – Boude

2
//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; 
10
//This prototype function allows you to remove even array from array 
Array.prototype.remove = function(x) { 
    var i; 
    for(i in this){ 
     if(this[i].toString() == x.toString()){ 
      this.splice(i,1) 
     } 
    } 
} 

Ejemplo de usando

var arr = [1,2,[1,1], 'abc']; 
arr.remove([1,1]); 
console.log(arr) //[1, 2, 'abc'] 

var arr = [1,2,[1,1], 'abc']; 
arr.remove(1); 
console.log(arr) //[2, [1,1], 'abc'] 

var arr = [1,2,[1,1], 'abc']; 
arr.remove('abc'); 
console.log(arr) //[1, 2, [1,1]] 

Para usar esta función de prototipo, debe pegarla en su código. A continuación, se puede aplicar a cualquier matriz con 'notación de puntos':

someArr.remove('elem1') 
+0

¡Una explicación un poco más no se puede perder aquí! –

+0

Para usar esta función de prototipo, debe pegarla en su código. Luego puede aplicarlo a cualquier matriz con 'notación de puntos', por ejemplo: someArr.remove ('elem1') – yesnik

+2

El único problema con algo así es que sobrescribe el método de eliminación del objeto Array global, es decir, cualquier otro código en el proyecto eso depende de que el comportamiento predeterminado termine con un comportamiento defectuoso. – jmort253

34

Puede utilizar underscore.js. Realmente hace las cosas simples.

En le caso de que el código que va a tener a la derecha es -

_.without([1,2,3], 2); 

y el resultado será [1,3].

Reduce el código que escribe.

1

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.

Así que después de unas pocas iteraciones termino con:

list = $.grep(list, function (o) { return !o.IsDeleted }); 
0

Mi versión de la respuesta de user113716. Su elimina un valor si no se encuentra ninguna coincidencia, lo cual 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.

como funciona:

  • $ .inArray (valor, matriz) es una función de jQuery que encuentra el primer índice de un value en un array
  • Los rendimientos por encima -1 si el valor no es encontrado, así que compruebe que es un índice válido antes de realizar la eliminación. Eliminar el índice -1 significa eliminar el último, lo cual no es útil aquí.
  • .splice (index, count) elimina count número de valores a partir de index, así que sólo quieren un count de 1
1

me gustaría extender la clase matriz mediante una función pick_and_remove(), así:

var ArrayInstanceExtensions = { 
    pick_and_remove: function(index){ 
     var picked_element = this[index]; 
     this.splice(index,1); 
     return picked_element; 
    } 
}; 
$.extend(Array.prototype, ArrayInstanceExtensions); 

Si bien puede parecer un poco prolijo, ahora puede llamar al pick_and_remove() en cualquier matriz que desee.

Uso:

array = [4,5,6]   //=> [4,5,6] 
array.pick_and_remove(1); //=> 5 
array;     //=> [4,6] 

se puede ver todo esto en acción de Pokemon con temas here.

3

Puede utilizar .no función como esta:

var arr = [ 1 , 2 , 3 , 5 , 8]; 
var searchValue = 2; 

var newArr = $(arr).not([searchValue]).get(); 
+1

Esto eliminará toda la matriz si el valor no está allí, por lo que searchValue = 4 devolverá una matriz en blanco. –

+1

He copiado el código en jsfiddle, he cambiado 'searchValue' a 4, ejecuté el código, no detecté ningún problema. Todos los valores todavía estaban presentes. @ JulianK – RST

31

jQuery.filter método es útil. Esto está disponible para objetos Array.

var arr = [1, 2, 3, 4, 5, 5]; 

var result = arr.filter(function(elem){ 
    return elem != 5; 
});//result -> [1,2,3,4] 

http://jsfiddle.net/emrefatih47/ar0dhvhw/

En EcmaScript 6:

let values = [1,2,3,4,5]; 
let evens = values.filter(v => v % 2 == 0); 
alert(evens); 

https://jsfiddle.net/emrefatih47/nnn3c2fo/

+2

Parece que funciona mejor que las soluciones propuestas, aunque en realidad no está alterando el conjunto existente, sino creando uno nuevo. También funciona con valores no existentes o una matriz vacía. Comprobación rápida del rendimiento en JSFiddle: con una matriz con 800.000 valores, tardé unos 6 segundos en completarla. Sin embargo, no estoy seguro si eso es rápido. – Flo

1
/** 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; 
} 

A continuación, puede llamar a la función de cualquier parte del 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!

0

para quitar con seguridad 2 de la matriz mediante vainilla JavaScript:

// 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) { 
     throw new TypeError('"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 array 
if (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] 

fuente Polyfill: Mozilla

1

Hay una solución simple con empalme. De acuerdo con W3School sigue la sintaxis de empalme;

array.splice(index, howmany, item1, ....., itemX) 

índice de requeridos. Un número entero que especifica en qué posición agregar/eliminar elementos, Usar valores negativos para especificar la posición desde el final de la matriz

howmany Requerido. La cantidad de elementos que se eliminarán. Si se establece en 0, no se eliminarán elementos

artículo1, ..., artículoX Opcional. Los nuevos elementos que se agregarán a la matriz

Tenga esto en cuenta, las siguientes js extraerá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; 

Así que el final debe ser similar al siguiente

x.splice(startItemIndex , itemsFound); 

Espero que esto ayude.

7

Eliminar elemento en Array

var arr = ["jQuery", "JavaScript", "HTML", "Ajax", "Css"]; 
var itemtoRemove = "HTML"; 
arr.splice($.inArray(itemtoRemove, arr), 1); 
1

comprueba en primer lugar si existe elemento de la matriz

$.inArray(id, releaseArray) > -1 

encima de la línea devuelve el índice de ese elemento si existe en la matriz , de lo contrario, devuelve -1

releaseArray.splice($.inArray(id, releaseArray), 1); 

ahora por encima de la línea eliminará este elemento de la matriz si se encuentra. Para resumir, la siguiente lógica es el código requerido para verificar y eliminar el elemento de la matriz.

if ($.inArray(id, releaseArray) > -1) { 
       releaseArray.splice($.inArray(id, releaseArray), 1); 
      } 
      else { 
       releaseArray.push(id); 
      } 
Cuestiones relacionadas