Foros del Web » Programando para Internet » Javascript »

remover un item especifico de array

Estas en el tema de remover un item especifico de array en el foro de Javascript en Foros del Web. Hola forer@s Una duda con un array: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original //declaro un array asi: myarray = [ ] ;   //le ...
  #1 (permalink)  
Antiguo 11/01/2014, 14:42
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
remover un item especifico de array

Hola forer@s

Una duda con un array:

Código Javascript:
Ver original
  1. //declaro un array asi:
  2. myarray = [];
  3.  
  4. //le ingreso unos valores
  5.  myarray.push({
  6.                 clave_estado: 100,
  7.                 clave_municipio: 110,
  8.                 id_articulo: 1078,
  9.                 id_comentario: 10
  10.             });
  11. alert(JSON.stringify(myarray));

el alert me muestra algo asi (si hubiera 2 items):

Código:
[
{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"}, {clave_estado: "200", clave_municipio: "210", id_articulo: "121", id_comentario: "8"}
]
hasta ahi todo bien, pero como le hago para borrar un item en especifico, osea

de lo que tiene el arreglo quitar este:

Código Javascript:
Ver original
  1. for(i=0; i<myarray.length;i++){
  2.    row = myarray[i];
  3.    if(row.clave_estado==100 && row.clave_municipio==110 && row.id_articulo==1078 && row.id_comentario==10){
  4.          //como hago para borrar esa fila ???
  5.    }
  6. }

vi que con splice pero como decirle algo si como

myarray.splice(
clave_estado: 100,
clave_municipio: 110,
id_articulo: 1078,
id_comentario: 10
);
  #2 (permalink)  
Antiguo 11/01/2014, 14:59
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 7 meses
Puntos: 578
Respuesta: remover un item especifico de array

Fácil, con el constructor delete ya que estamos con un objeto JSON:

Código Javascript:
Ver original
  1. delete row.clave_estado;

Última edición por PHPeros; 11/01/2014 a las 15:05
  #3 (permalink)  
Antiguo 11/01/2014, 16:07
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: remover un item especifico de array

hola PHPeros gracias por responder

No es tan facil por que imaginate si tuviera el siguiente arreglo:

Código:
[
{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"}, 
{clave_estado: "100", clave_municipio: "120", id_articulo: "108", id_comentario: "120"}, 
{clave_estado: "100", clave_municipio: "120", id_articulo: "200", id_comentario: "50"}, 
{clave_estado: "200", clave_municipio: "210", id_articulo: "121", id_comentario: "8"}
]
y yo solo quisiera borrar

{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"},

Le doy

Código Javascript:
Ver original
  1. delete row.clave_estado;

y lo que me queda:

Código:
[ 
{clave_estado: "200", clave_municipio: "210", id_articulo: "121", id_comentario: "8"}
]
no? no se supone que debo especificar o estoy confundida ??
  #4 (permalink)  
Antiguo 11/01/2014, 17:46
Avatar de hackjose  
Fecha de Ingreso: abril-2010
Ubicación: Edo Mexico
Mensajes: 1.178
Antigüedad: 14 años
Puntos: 131
Respuesta: remover un item especifico de array

Tendrias que iterar el array y ya despues hacer lo que dice PHPeros
  #5 (permalink)  
Antiguo 11/01/2014, 18:05
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: remover un item especifico de array

hola

entonces a ver si entiendo, si hago esto:

Código Javascript:
Ver original
  1. for(i=0; i<myarray.length;i++){
  2.    row = myarray[i];
  3.    if(row.clave_estado==100 && row.clave_municipio==110 && row.id_articulo==1078 && row.id_comentario==10){
  4.          delete row.clave_estado;
  5.    }
  6. }

eso me daría resultado

bueno en cuanto pueda lo pruebo y les comento, muchas gracias
  #6 (permalink)  
Antiguo 12/01/2014, 02:28
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: remover un item especifico de array

Cita:
Iniciado por PHPeros Ver Mensaje
Fácil, con el constructor delete ya que estamos con un objeto JSON:

Código Javascript:
Ver original
  1. delete row.clave_estado;
No tan fácil. Delete no sirve para borrar posiciones de un array; sólo las pone a undefined.

Para borrar posiciones de un array se puede utilizar splice.

Código Javascript:
Ver original
  1. for(i=myarray.length-1; i>=0;i--){
  2.    row = myarray[i];
  3.    if(row.clave_estado==100 && row.clave_municipio==110 && row.id_articulo==1078 && row.id_comentario==10){
  4.          myarray.splice(i,1);
  5.    }
  6. }
Notar que para borrar posiciones de un array usando un sólo for, hay que recorrerlo al revés; porque al eliminar algún elemento del array, el "for" llegaría hasta índices que ya no existen.
  #7 (permalink)  
Antiguo 12/01/2014, 08:19
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: remover un item especifico de array

sí puedes usar delete con un array json
Cita:
Array.prototype.fnc = function(prop1, prop2, prop3, prop4) {
this.forEach(function(valor, indice, arr) {
if (valor[prop1] == 100 && valor[prop2] == 110 && valor[prop3] == 1078 && valor[prop4] == 10) {
delete arr[indice];
}

});
}

myarray.fnc('clave_estado', 'clave_municipio', 'id_articulo', 'id_comentario');

console.log(myarray);
https://developer.mozilla.org/en-US/...erators/delete
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #8 (permalink)  
Antiguo 12/01/2014, 09:31
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: remover un item especifico de array

No, no se pueden borrar posiciones de un array con delete.
Pone la posición a undefined, y eso no es lo que se busca.
  #9 (permalink)  
Antiguo 13/01/2014, 09:46
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: remover un item especifico de array

hola chic@s gracias por sus respuestas,

probado el codigo de marlanga

Código Javascript:
Ver original
  1. for(i=myarray.length-1; i>=0;i--){
  2.    row = myarray[i];
  3.    if(row.clave_estado==100 && row.clave_municipio==110 && row.id_articulo==1078 && row.id_comentario==10){
  4.          myarray.splice(i,1);
  5.    }
  6. }

Puedo decir que me funciona ok

aunque por ahí recuerdo que lei que hay 2 tipos de array, el de objeto y el "normal" y que para el de objeto si se puede usar delete y splice y que para el "normal" no se puede usar delete por lo que dice marlanga que no se borra el item si no que se pone en undefined. Pero creo que para el tipo de array que estoy usando que creo que es de objeto si es valido el delete.
  #10 (permalink)  
Antiguo 13/01/2014, 15:22
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: remover un item especifico de array

da igual que sea un objeto o un array. delete elimina el elemento que se indique. en caso de ser un array (su indice) y si es un objeto (su propiedad). a ver si ahora también vamos a discutir a la mdn

Cita:
JSON = {
0:{clave_estado1: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"},
1:{clave_estado: "200", clave_municipio: "210", id_articulo: "121", id_comentario: "8"}
};

delete JSON[0];

console.log(JSON);
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #11 (permalink)  
Antiguo 13/01/2014, 15:49
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: remover un item especifico de array

Creo que debería ir un break luego de myarray.splice(i, 1) para salir del bucle y ya no se siga buscando coincidencias, claro, siempre y cuando no hayan más coincidencias, lo cual no parece ser el caso, de otro modo, debe quedar como está.

Buen algoritmo, marlanga.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #12 (permalink)  
Antiguo 13/01/2014, 16:54
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: remover un item especifico de array

Cita:
Iniciado por IsaBelM Ver Mensaje
da igual que sea un objeto o un array. delete elimina el elemento que se indique. en caso de ser un array (su indice) y si es un objeto (su propiedad). a ver si ahora también vamos a discutir a la mdn
Eso que declaras no es un array, es un objeto, que en javascript pueden ser accedidos como si fueran arrays asociativos.

Con un array normal, delete los "destroza" creando huecos.
http://jsfiddle.net/marlanga/CKwaW/1/

Última edición por marlanga; 13/01/2014 a las 17:38
  #13 (permalink)  
Antiguo 14/01/2014, 07:07
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: remover un item especifico de array

he ratificado y refutado las afirmaciones de unos y de otros dentro del contexto de este post. comparemos delete y splice()

Cita:
var myarray = [
{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"},
{clave_estado: "100", clave_municipio: "120", id_articulo: "108", id_comentario: "120"},
{clave_estado: "100", clave_municipio: "120", id_articulo: "200", id_comentario: "50"},
{clave_estado: "200", clave_municipio: "210", id_articulo: "121", id_comentario: "8"}
];

console.time('a');

Array.prototype.fnc = function(prop1, prop2, prop3, prop4) {
this.forEach(function(valor, indice, arr) {
if (valor[prop1] == 100 && valor[prop2] == 110 && valor[prop3] == 1078 && valor[prop4] == 10) {
delete arr[indice];
console.log(indice);
}

});
}

myarray.fnc('clave_estado', 'clave_municipio', 'id_articulo', 'id_comentario');

console.log(myarray);
console.log(myarray.length);
console.timeEnd('a');



var myarray2 = [
{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"},
{clave_estado: "100", clave_municipio: "120", id_articulo: "108", id_comentario: "120"},
{clave_estado: "100", clave_municipio: "120", id_articulo: "200", id_comentario: "50"},
{clave_estado: "200", clave_municipio: "210", id_articulo: "121", id_comentario: "8"}
];

console.time('b');

Array.prototype.fnc2 = function(prop1, prop2, prop3, prop4) {
this.forEach(function(valor, indice, arr) {
if (valor[prop1] == 100 && valor[prop2] == 110 && valor[prop3] == 1078 && valor[prop4] == 10) {
arr.splice(indice, 1);
}

});
}

myarray2.fnc2('clave_estado', 'clave_municipio', 'id_articulo', 'id_comentario');

console.log(myarray2);
console.log(myarray2.length);
console.timeEnd('b');
como podemos observar en ambos casos se eliminan los elementos, pero a diferencia de splice(), con delete se mantiene el largo original. esto es debido a que el elemento es establecido como undefined. en cuestión de tiempos de ejecución no hay diferencias entre uno u otro

ahora pongamos que tenemos elementos repetidos y consecutivos. aquí cambiaría totalmente la cosa. delete, eliminaría ambos, mientras que splice() eliminaría sólo el primer elemento

Cita:
var myarray = [
{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"},
{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"},
{clave_estado: "100", clave_municipio: "120", id_articulo: "108", id_comentario: "120"},
{clave_estado: "100", clave_municipio: "120", id_articulo: "200", id_comentario: "50"},
{clave_estado: "200", clave_municipio: "210", id_articulo: "121", id_comentario: "8"}
];

console.time('a');

Array.prototype.fnc = function(prop1, prop2, prop3, prop4) {
this.forEach(function(valor, indice, arr) {
if (valor[prop1] == 100 && valor[prop2] == 110 && valor[prop3] == 1078 && valor[prop4] == 10) {
delete arr[indice];
console.log(indice);
}

});
}

myarray.fnc('clave_estado', 'clave_municipio', 'id_articulo', 'id_comentario');

console.log(myarray);
console.log(myarray.length);
console.timeEnd('a');



var myarray2 = [
{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"},
{clave_estado: "100", clave_municipio: "110", id_articulo: "1078", id_comentario: "10"},
{clave_estado: "100", clave_municipio: "120", id_articulo: "108", id_comentario: "120"},
{clave_estado: "100", clave_municipio: "120", id_articulo: "200", id_comentario: "50"},
{clave_estado: "200", clave_municipio: "210", id_articulo: "121", id_comentario: "8"}
];

console.time('b');

Array.prototype.fnc2 = function(prop1, prop2, prop3, prop4) {
this.forEach(function(valor, indice, arr) {
if (valor[prop1] == 100 && valor[prop2] == 110 && valor[prop3] == 1078 && valor[prop4] == 10) {
arr.splice(indice, 1);
}

});
}

myarray2.fnc2('clave_estado', 'clave_municipio', 'id_articulo', 'id_comentario');

console.log(myarray2);
console.log(myarray2.length);
console.timeEnd('b');
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #14 (permalink)  
Antiguo 14/01/2014, 15:57
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: remover un item especifico de array

Al usar el foearch junto a splice has cometido el error mas típico. Ya comenté que para eliminar con splice elementos de un array, hay que recorrerlo al revés para no tener problemas.

Cita:
Iniciado por marlanga Ver Mensaje
Notar que para borrar posiciones de un array usando un sólo for, hay que recorrerlo al revés; porque al eliminar algún elemento del array, el "for" llegaría hasta índices que ya no existen.
Así que ya ves, no me convence del todo eso de que ratificas y refutas afirmaciones. Splice es de lo mejor para borrar posiciones, siempre que sepas lo que estás haciendo. También el método filter, que éste sí, es polivalente: vale tanto para arrays como para arrays asociativos-objetos, aunque lo que hace es devolver una copia sin modificar el original.

http://jsfiddle.net/marlanga/yCwNZ/

Última edición por marlanga; 14/01/2014 a las 16:07
  #15 (permalink)  
Antiguo 15/01/2014, 04:37
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: remover un item especifico de array

mi pretensión no era convencerte. era demostrar el hecho que es factible usar delete. y eso ha quedado meridianamente claro, independientemente de si se está usando un array o un objeto.

a propósito

Cita:
Iniciado por marlanga Ver Mensaje
Al usar el foearch junto a splice has cometido el error mas típico.
habría puesto la mano en el fuego que había redactado, al final del segundo código, algo como "esto es salvable si en lugar de usar foreach() se usa un ciclo inverso". me habría quemado. no ha habido ninguna parcialidad por mi parte
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #16 (permalink)  
Antiguo 15/01/2014, 10:18
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: remover un item especifico de array

Si lo que quieres es crearle huecos al array, impidiendo recorrerlo después con el típico for i=0 hasta i<array.length, adelante, usa el delete.

Claro que es factible, pero yo sólo subrayo de si es lo recomendable, o lo mejor. Y claramente no lo es. Unos alicates también clavan púas, pero cuando preguntes, te recomendarán un martillo.
  #17 (permalink)  
Antiguo 15/01/2014, 16:27
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: remover un item especifico de array

puedes usar for .... in o forEach(). y ya para cerrar el circulo, si el array está prototipado, se usa hasOwnProperty() para saber si la propiedad es heredada del prototipo o es propia

R.I.P
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #18 (permalink)  
Antiguo 15/01/2014, 16:32
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: remover un item especifico de array

¿En serio recomiendas el uso de delete para eliminar posiciones del array? No me lo creo.
  #19 (permalink)  
Antiguo 16/01/2014, 08:29
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: remover un item especifico de array

creo que no he recomendado nada. ya he explicado cual ha sido mi motivación para intervenir en este tema.
si quieres mi opinión, no usaría ni splice() ni delete. como bien apuntastes usaría filter(), aunque recomendaría usar splice() por aquello de evitar tener que usar polyfill para que haya compatibilidad con versiones antiguas de navegadores
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #20 (permalink)  
Antiguo 17/01/2014, 10:19
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: remover un item especifico de array

Pues yo no. Yo siempre uso splice que es el más usado, sencillo y rápido que cualquier otra alternativa.
Incluso en PHP, también tiene su array_splice que todo dios usa para lo mismo.

Última edición por marlanga; 17/01/2014 a las 10:27

Etiquetas: especifico, item, js, remover
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:22.