Cómo iterar sobre una matriz y eliminar elementos en JavaScript [duplicar]
Esta pregunta ya tiene una respuesta aquí:
Tengo una serie de elementos y necesito eliminar algunos de ellos. El problema es que JavaScript no parece tener un para cada bucle y si uso un bucle for me encuentro con problemas con él, básicamente, tratando de comprobar elementos más allá de los límites de la matriz, o elementos faltantes en la matriz porque los índices cambian. Déjame mostrarte lo que quiero decir:
var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = 0; i < elements.length; i++){
if(elements[i] == 5){
elements.splice(i, 1);
}
}
El problema es que cuando se eliminan los elementos[1], los elementos[2] se convierten en elementos[1]. Así que el primer problema es que algunos elementos nunca se examinan. El otro problema es ese .la longitud cambia y si codifico los límites, entonces podría estar tratando de examinar elementos más allá de los límites de la matriz. Entonces, ¿cuál es la mejor manera de hacer esto increíblemente simple cosa?
6 answers
Comenzar desde el principio!
var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = elements.length -1; i >= 0 ; i--){
if(elements[i] == 5){
elements.splice(i, 1);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-03 05:58:37
Puedes usar el método filter
aquí:
var elements = [1, 5, 5, 3, 5, 2, 4].filter(function(a){return a !== 5;});
//=> elements now [1,3,2,4]
O si no quieres tocar elements
:
var elementsfiltered
,elements = [1, 5, 5, 3, 5, 2, 4]
.filter( function(a){if (a!==5) this.push(a); return true;},
elementsfiltered = [] );
//=> elementsfiltered = [1,3,2,4], elements = [1, 5, 5, 3, 5, 2, 4]
Véase Documentación de MDN para filter
Alternativamente puede extender el Array.prototype
Array.prototype.remove = Array.prototype.remove || function(val){
var i = this.length;
while(i--){
if (this[i] === val){
this.splice(i,1);
}
}
};
var elements = [1, 5, 5, 3, 5, 2, 4];
elements.remove(5);
//=> elements now [1,3,2,4]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-03 06:39:08
var elements = [1, 5, 5, 3, 5, 2, 4];
var i = elements.length;
while (i--) {
if (elements[i] == 5) {
elements.splice(i, 1);
}
}
console.log(elements);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-27 21:58:03
Usando Array.shift():
var array = [1, 2, 3, 'a', 'b', 'c'];
while (array.length > 0) {
console.log(array.shift());
}
Editar: Probablemente no se adapte a las especificaciones. Malinterpreté la pregunta (solo eliminé ciertos elementos ) y estaba demasiado ansioso por agregar un método que aún no se había mencionado...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-23 15:09:42
Simplemente podrías decrementar i
cada vez que elimines un objeto.
var elements = [1, 5, 5, 3, 5, 2, 4];
var l = elements.length;
for(var i = 0; i < l; i++){
if(elements[i] == 5){
elements.splice(i, 1);
i--;
}
}
console.log(elements);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-18 14:42:12
Este es un ejemplo de uso de matriz .Índice de, while and Array.splice para eliminar elementos en línea.
var elements = [1, 5, 5, 3, 5, 2, 4];
var remove = 5;
var index = elements.indexOf(remove);
while (index !== -1) {
elements.splice(index, 1);
index = elements.indexOf(remove);
}
console.log(elements);
On jsfiddle
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-03 06:27:36