2011-07-26 8 views
18

quiero hacer algo como:¿Devolviendo una matriz sin un elemento eliminado? ¿Usar empalme() sin cambiar la matriz?

var myArray = ["one","two","three"]; 
document.write(myArray.splice(1,1)); 
document.write(myArray); 

para que muestre primero "tres", y luego "uno, dos, tres". Sé que splice() devuelve el elemento eliminado y cambia la matriz, pero ¿hay función para devolver una nueva matriz con el elemento eliminado? Probé:

window.mysplice = function(arr,index,howmany){ 
    arr.splice(index,howmany); 
    return arr; 
}; 

si trato:

var myArray = ["one","two","three"]; 
document.write(mySplice(myArray,1,1)); 
document.write(myArray); 

Todavía cambia miMatriz ...

por favor ayuda.

Respuesta

18

como sugiere la respuesta a continuación, aquí es una instantánea de código

var myArray = ["one","two","three"]; 
var cloneArray = myArray.slice(); 

myArray.splice(1,1); 

document.write(myArray);  
document.write(cloneArray); 
+0

¿Por qué duplicar el uso de la memoria sin ningún motivo? – AlienWebguy

+0

Gracias. ¿Se están creando punteros aquí? No entiendo por qué está cambiando la matriz original ... – mowwwalker

+3

el autor realmente quiere la matriz con el elemento eliminado ["uno", "tres"], no el elemento eliminado ("dos"). – Neverever

27

¿Quieres slice:

Devuelve una copia profunda de un nivel de una parte de una matriz.

Así que si

a = ['one', 'two', 'three' ]; 
b = a.slice(1, 3); 

Entonces a seguirá siendo ['one', 'two', 'three'] y b será ['two', 'three']. Deberá tener cuidado con el segundo argumento de slice sin embargo, es uno más que el último índice que desea cortar a cabo:

índice basado en cero

en el que poner fin a la extracción. slice extrae hasta end, pero no lo incluye.

+0

No importa, pensé que quería decir otra cosa. – mowwwalker

1

lugar de esto:

document.write(myArray.splice(1,1)); 

por qué no sólo tiene que utilizar:

document.write(myArray[1]); 

splice() modifica la matriz en su lugar por definición. Vea slice() si quiere una copia.

2

Hoy en día, las bibliotecas funcionales tales como ramda.js con su función remove ser útiles:

remove 
Number → Number → [a] → [a] 

R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8] 

Elimina la sublista de la lista que comienza en el inicio del índice y contiene elementos de conteo. Tenga en cuenta que esto no es destructivo: devuelve una copia de la lista con los cambios. No se han dañado las listas en la aplicación de esta función.

5

Utilice esta:

function spliceNoMutate(myArray,indexToRemove) { 
    return myArray.slice(0,indexToRemove).concat(myArray.slice(indexToRemove+1)); 
} 
2

Sé que esta pregunta es viejo, pero este enfoque puede ser útil.

var myArray = ["one","two","three"]; 
document.write(myArray.filter(function(v, index) { return index !== 1 }) 

o

var myArray = ["one","two","three"]; 
document.write(myArray.filter(function(v, index) { return v !== "two" }) 

Este utiliza la función Array.filter() y pruebas contra ya sea el índice ser 1 o el valor de ser "dos".


Ahora, no puedo garantizar el rendimiento de esta solución (ya que comprueba cada elemento en la matriz, answer de Nguyen podría ser más eficiente), pero es más flexible si desea hacer cosas más complicadas y es más fácil de entender.

1

Usted puede utilizar la función de propagación ES6:

let myArray = ['one','two','three']; 
let mySplicedArray = [...myArray]; 
mySplicedArray.splice(1,1); 

console.log(myArray); /// ['one', 'two', 'three'] 
console.log(mySplicedArray); /// ['one', 'three'] 
+0

'mySplicedArray' contendrá el elemento eliminado de la copia de' myArray' (['two']), no del conjunto original menos el elemento eliminado (['uno', 'tres']). El autor quería lo último. Creo que el autor querría esto: '' 'let mySplicedArray = [... myArray]; mySplicedArray.splice (1,1); console.log (myArray); '' 'que da como resultado ['uno', 'tres'] – bergie3000

+0

@ bergie3000 tiene razón. Editaré la respuesta. – arthurDent

Cuestiones relacionadas