2012-01-15 10 views
8

Tengo una gran variedad de artículos como:Eliminar un elemento de una matriz por valor

var items = [id: "animal", type: "cat", cute: "yes"] 

Y yo estoy tratando de eliminar los elementos que coinciden con el ID dado. En este caso; animal

¡Estoy atascado! Puedo hacer que funcione fácilmente al tener una matriz más simple, pero esto no es lo que necesito ... También necesito eliminar el artículo por valor, ya que no quiero la molestia de referirme a elementos por su índice.

¿Existe un método jQuery que podría usar donde no necesite iterar a través de la matriz de elementos, en lugar de especificar un selector?

Aquí es mi jsFiddle: http://jsfiddle.net/zafrX/

+4

Su sintaxis es válido. ¿Tienes una matriz o un objeto? Usted ha mezclado la sintaxis. –

+1

Si mira en la consola de javascript (firebug, en mi caso), generó ese error, 'Untaught SyntaxError: Token inesperado:' Debe crear un objeto Item, y podrá acceder fácilmente a los atributos del artículo –

+1

object 'var items = {id:" animal ", tipo:" cat ", lindo:" yes "}', array 'var items = [" animal "," cat "," yes "]' –

Respuesta

19

No estoy seguro de cuánto de una molestia que es hacer referencia a elementos de matriz de índice. La manera estándar para eliminar elementos de matriz es con el splice method

for (var i = 0; i < items.length; i++) 
    if (items[i] === "animal") { 
     items.splice(i, 1); 
     break; 
    } 

Y por supuesto que se puede generalizar esto en una función auxiliar por lo que no tiene que duplicar esta en todas partes.


EDITAR

simplemente me di cuenta de esta sintaxis incorrecta:

var items = [id: "animal", type: "cat", cute: "yes"] 

Quiso decir algo como esto:

var items = [ {id: "animal", type: "cat", cute: "yes"}, {id: "mouse", type: "rodent", cute: "no"}]; 

que cambiaría el código de eliminación a esta :

for (var i = 0; i < items.length; i++) 
    if (items[i].id && items[i].id === "animal") { 
     items.splice(i, 1); 
     break; 
    } 
+0

Esa es exactamente la respuesta. Hombre, me tienes por ocho segundos. –

5

Puede usar splice o ejecutar un borrado usted mismo. He aquí un ejemplo:

for (var i = 0; i < items.length; i ++) { 
    if (items[i] == "animal") { 
     items.splice(i, 1); 
     break; 
    } 
} 
2

Debe hacerlo de esta manera (asegúrese de que usted tiene la sintaxis correcta ... no se puede tener gran variedad de propiedades, pero objeto dentro {} y entonces usted puede iterar por las teclas y eliminar no deseados clave):

var items = {id: "animal", type: "cat", cute: "yes"} 
var removeItem = "animal"; // or with the ID matching animal... 

for(var p in items){ 
    if(items[p] === removeItem) 
     delete items[p] 
} 

Y para responder a su pregunta, no puede aplicar los selectores de jquery a los objetos de JavaScript. Lo mejor que puede hacer para evitar el bucle for es usar $.each (que es un bucle escrito de una manera más "funcional").

+0

Creo que esta podría ser la respuesta correcta. Me perdí la sintaxis incorrecta de OP. –

2

Mediante el uso de objetos de notación: http://jsfiddle.net/jrm2k6/zafrX/2/

var animal1 = {id: "animal", type: "cat", cute: "yes"} 
var car2 = {id: "car", type: "pick-up", cute: "no"} 
var animal3 = {id: "animal", type: "dog", cute: "yes"} 
var removeItem = "animal"; // or with the ID matching animal... 

var array_items = [] 
array_items.push(animal1); 
array_items.push(car2); 
array_items.push(animal3); 

for(var i=0;i<array_items.length;i++){ 
    if(array_items[i].id == removeItem){ 
     array_items.splice(i,1); 
    } 
} 

//alert(array_items.length); 
0

Wow, muchas ideas, pero todavía no lo que quería xD

Esto eliminará todas las entradas del valor dado y devolver el valor eliminado:

function removeOfArray(val, arr){ 
    var idx; 
    var ret; 
    while ((idx = arr.indexOf(val)) > -1){ 
     arr.splice(idx, 1); 
     ret = val; 
    } 
    return ret; 
} 

también he encontrado otras soluciones aquí: Remove item from array by value

3

No hay necesidad de jQuery o cualquier tercera parte lib para esto, ahora podemos usar el nuevo filtro ES5:

let myArray = [{ id : 'a1', name : 'Rabbit'}, { id : 'a2', name : 'Cat'}]; 
myArray = myArray.filter(i => i.id !== 'a1'); 
Cuestiones relacionadas