2012-08-07 8 views
6

Estoy tratando de eliminar un elemento de mi matriz mediante división, pero no puedo hacer que funcione, mire este fragmento de código.Eliminar elemento de la matriz, utilizando el segmento

console.log(this.activeEffects); // Prints my array 
    console.log(this.activeEffects.slice(0,1)); // Remove from index 0, and remove one. 
    console.log(this.activeEffects); // Prints array again, this time my element should be gone 

El resultado de esto es.

enter image description here

Entonces, ¿qué es conseguir de todo esto es, en un primer momento la matriz es todo, como debe ser. Luego imprime lo que se corta en la matriz. Finalmente, el tercero debería estar vacío? ¿o?

+1

¿Se puede hacer jsfiddle para esto? –

+0

¿Estás seguro de que esto es una matriz? –

Respuesta

12

Creo que estás buscando splice. De W3 Schools:

El método de empalme() agrega/quita elementos a/de una matriz y devuelve los elementos eliminados.

Eche un vistazo al ejemplo en esa página; el caso de uso es similar a lo que quiere lograr.

EDITAR: Alternative link to MDN, según lo sugerido por Nicosunshine; mucha más información sobre el comando allí.

+13

Sé que podría sonar molesto, pero no use W3 Schools. MDN es un recurso mucho mejor https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/splice – NicoSantangelo

+0

Gracias TSL, esto resolvió mi problema. Bofeteando a mi ser ahora mismo. – MartinElvar

+0

@nicosunshine a Meta para solicitar el bloqueo automático de enlaces w3schools! – canon

5

.slice no muta la matriz, se puede usar .splice() para eliminar el elemento en la posición en la matriz i:

this.activeEffects.splice(i, 1) 
+0

Pero es posible que necesite eliminar un elemento en el medio de la matriz – MartinElvar

+0

@MartinElvarJensen, no me di cuenta. 'shift()' es preferible cuando quieres eliminar desde el principio. – Esailija

+0

rebanada no cambia la matriz original como él dice, pero devuelve los elementos eliminados. ¿Por qué no reemplazar la matriz original por los elementos eliminados haciendo una tarea? p.ej. this.activeEffects = this.activeEffects.slice (0,1) – Magrangs

1

Array.prototype. slice() ...

no altera la matriz original, pero devuelve una nueva " un nivel profundo" copia que contiene copias de los elementos en rodajas de la matriz original. Los elementos de la matriz original se copian en el nuevo matriz como sigue:

Mientras Array.prototype. splice() ...

cambia el contenido de una matriz, la adición de nuevos elementos, mientras que la eliminación de elementos antiguos.

Este ejemplo debe ilustrar la diferencia.

// sample array 
 
var list = ["a","b","c","d"]; 
 
// slice returns a new array 
 
console.log("copied items: %o", list.slice(2)); 
 
// but leaves list itself unchanged 
 
console.log("list: %o", list); 
 
// splice modifies the array and returns a list of the removed items 
 
console.log("removed items: %o", list.splice(2)); 
 
// list has changed 
 
console.log("list: %o", list);

-1

Mira aquí: http://www.w3schools.com/jsref/jsref_slice_array.asp

Se puede ver que el método rebanada elija objeto y tirarlos en un nuevo objeto de matriz ^^ Así no se puede eliminar un objeto de esta manera, puede intentar algo como esto:

var a = ["a","b","c"]; (pseudo code) 
/* I wan't to remove the "b" object */ 

var result = a.slice(0,1)+a.slice(2,1); /* If you considers that "+" is a concatenation operator, i don't remember if it is true... */ 
3

Esto es lo que pude venir con:

var newArray = oldArray.slice(indexOfElementToRemove+1).concat(oldArray.slice(0,indexOfElementToRemove)); 
1
function removeItemWithSlice(index) { 
    return [...items.slice(0, index), ...items.slice(index + 1)] 
} 

rebanada creará una nueva matriz.Creamos dos arrays: desde el inicio hasta el índice y desde el índice + 1 hasta el final. A continuación, aplicamos el operador de difusión (...) para tomar los elementos de esas matrices y crear una nueva matriz única que contenga todos los elementos que nos interesan. Pegaré de manera equivalente si no te gusta el delineador:

function removeItemWithSlice(index) { 
    const firstArr = items.slice(0, index); 
    const secondArr = items.slice(index + 1); 
    return [...firstArr , ...secondArr] 
} 
Cuestiones relacionadas