2012-06-15 14 views
8
var fruit = ["apple","pear","pear","pear","banana"]; 

¿Cómo elimino toda la fruta "pera" de esta matriz?
He intentado lo siguiente, pero sigue siendo una pera:Cómo eliminar elementos de matriz específicos de un bucle foreach en javascript

for(var f in fruit) { 
    if (fruit[f] == "pear") { 
     fruit.splice(f, 1); 
    } 
} 

for(var f in fruit) { 
    document.write(fruit[f]+"<br>");   
} 

Salidas:

apple 
pear 
banana 

¿qué estoy haciendo mal? demostración en vivo: http://jsfiddle.net/SbxHc/

+2

Espere ... 'F' no es ni siquiera un índice (número)! –

+2

'fruit = fruit.filter (function (f) {return f! ==" pear ";});' –

Respuesta

25
var fruit = ["apple", "pear", "pear", "pear", "banana"], 
    i; 

for (i = 0; i < fruit.length; ++i) { 
    if (fruit[i] === "pear") { 
     fruit.splice(i--, 1); 
    } 
} 

console.log(fruit); 
//["apple", "banana"] 
+0

¡Gracias!¿Tengo que usar un bucle como el tuyo? ¿También es posible usar la variante foreach? – Nick

+0

Pruebe esto ['[] .forEach()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach). –

+4

@Nick No, no es posible. Nunca debe usar 'for..in' con matrices de todos modos. – Esailija

7
for (var i = fruit.length - 1; i > -1; i--) { 
    if (fruit[i] == "pear") 
     fruit.splice(i, 1); 
} 
+2

Entonces, ¿dónde está la parte 'fruit [i] == 'pear' '? –

+0

oeps, qué equivocación con maka, ;-) – Tom

-1
for(var f in fruit) { 
    if (fruit[f] == "pear") { 
     fruit.splice(f-1, 1); 
    } 
} 

for(var f in fruit) { 
    document.write(fruit[f]+"<br>");   
} 

disfrutar

+0

'f' no es un número. –

2

Si hay un montón de elementos 'incorrectas' en la matriz original, sugiero al menos teniendo en cuenta que no utilizan matriz en el lugar, en vez recogiendo todos los elementos 'correctas' en una nueva matriz:

var rightFruits = []; 
for (var i = 0, len = fruit.length; i < len; ++i) { 
    if (fruit[i] !== 'pear') { 
    rightFruits.push(fruit[i]); 
    } 
} 
+0

Gracias, solíamos hacer este enfoque con C#. ¿Es más costoso hacerlo, en lugar de usar un empalme()? – Nick

+0

Una variable adicional –

+0

@Derek Pregunta rápida: ¿cómo se implementan las matrices en JavaScript? – raina77ow

1
var i; 
for (i = 0; i < fruits.length; i += 1) { 
    if (fruits[i] == "pear") { 
     fruits.splice(i, 1); 
     i -= 1; 
    } 
} 

6.4. Enumeración

Dado que las matrices de JavaScript son realmente objetos, la instrucción for in se puede usar para iterar sobre todas las propiedades de una matriz. Desafortunadamente, for in no garantiza el orden de las propiedades, y la mayoría de las aplicaciones de matriz esperan que los elementos se produzcan en orden numérico. Además, todavía existe el problema con que se dragan las propiedades inesperadas de la cadena del prototipo.

Afortunadamente, la sentencia convencional para evita estos problemas. La declaración de JavaScript para es similar a que en la mayoría de los lenguajes tipo C. Es controlado por tres cláusulas: la primera inicializa el bucle, el segundo es la condición cuando, y la tercera hace la subasta:

var i; 
for (i = 0; i < myArray.length; i += 1) { 
    document.writeln(myArray[i]); 
} 
3

Cuando se quitan los elementos de una matriz como iterar sobre ella, lo haría generalmente iteración hacia atrás para que el índice actual no salta sobre los elementos al quitarlos:

var fruit = ["apple","pear","pear","pear","banana"]; 
var i; 

for (i = fruit .length - 1; i >= 0; i--) { 
    if (fruit [i] === "pear") { 
     fruit .splice(i, 1); 
    }   
} 

console.log(fruit); 
+0

¡De hecho! Lástima que no se puede hacer con el ... en, pero supongo que soy perezoso. :PAG – Nick

0
var i; while ((i = fruit.indexOf("pear")) > -1) fruit.splice(i,1); 

Sé consciente de que Array.indexOf no es compatible con Internet Explorer 8 y por debajo. -_-

0

¿Por qué no repetir la lista al revés? De esta manera, cuando se elimina un elemento de la lista y los cambios de longitud, no se rompe la lógica de bucle:

var fruit = ["apple","pear","pear","pear","banana"]; 
for (var i = fruit.length - 1; i >= 0; i--) { 
    if (fruit[i] === "pear") { 
     fruit.splice(i, 1); 
    } 
} 

console.log(fruit); // ["apple", "banana"] 
0

Si no le importa para iterar inversa, se puede utilizar una combinación de tiempo y emergente función de matriz

var daltons = [ 
    { id: 1, name: "Joe" }, 
    { id: 2, name: "William" }, 
    { id: 3, name: "Jack" }, 
    { id: 4, name: "Averell" } 
]; 

var dalton; 
while (dalton=daltons.pop()) { 
    console.log(dalton.name); 
} 

console.log(daltons); 
0

también podría utilizar un filter:

let noPears = fruits.filter(fruit => fruit != 'pear') 
Cuestiones relacionadas