Borrar indice de un objeto JSON

543 views
Skip to first unread message

Ricky Muñoz

unread,
Jun 11, 2014, 3:52:29 PM6/11/14
to jsp...@googlegroups.com
Estimados amigos,
Quiero eliminar un indice de un objeto Json (como ya lo mencioné en el título), hice un pequeño resumen de lo que trato de hacer y en vez de eliminar solo un indice, me deja vacío el objeto y quisiera saber porqué pasa eso y cómo puedo solventarlo:

var favoritos =   { 
     '1453137': 
     {
          key: 'value',
          key2: 'value2'
     },
     '4269000': 
     {    
          key: 'value',
          key2: 'value2'
     } 
}
var cab = 1453137;

delete favoritos[cab];

Como pueden observar es un objeto el cual tiene como indices "numeros" (pero como string), luego en el desarrollo de mi programa yo guardo cada indice en un arreglo el cual recupero cuando lo necesito (ese procedimiento me parece irrelevante por ahora, ya que estoy desarrollando en Nodejs pero no tiene que ver). La idea es que cuando ejecute el "delete" simplemente elimine el indice correspondiente y me deje el otro. Cuando yo hago eso, al final si hago un console.log(favoritos) me muestra lo siguiente: {}

Alguien tiene alguna idea??? 

Muchas gracias.

Alvaro Pereyra Rabanal

unread,
Jun 11, 2014, 3:57:48 PM6/11/14
to jsp...@googlegroups.com
Hola Ricky,

Acabo de probar esas mismas líneas en la consola de Chrome y me retorna:

favoritos
 Object {4269000: Object}

¿No hay nada más que estés haciendo ahí?

Nicolas Valcarcel

unread,
Jun 11, 2014, 3:59:01 PM6/11/14
to jsp...@googlegroups.com
Aca me funciona bien en Safari, has revisado que este asignando bien la variable cab?

-- 
Has recibido este mensaje porque estás suscrito al grupo "JavaScript Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a jsperu+un...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

---
Nicolas Valcarcel
a.k.a. nxvl

Alfredo Sumaran

unread,
Jun 11, 2014, 4:00:14 PM6/11/14
to jsp...@googlegroups.com
A mi también me funciona bien en node y la consola de Chrome, seguro que no hay otro paso que estés haciendo?

Luis Enrique Muñoz

unread,
Jun 11, 2014, 4:03:01 PM6/11/14
to jsp...@googlegroups.com
Pues sí... déjenme ver como hago para explicarles mejor el caso, voy a prepararlo les pido unos minutos


El 11 de junio de 2014, 14:59, Alfredo Sumaran <a.su...@gmail.com> escribió:
A mi también me funciona bien en node y la consola de Chrome, seguro que no hay otro paso que estés haciendo?

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "JavaScript Perú" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/jsperu/HnHp8dXBpyA/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a jsperu+un...@googlegroups.com.

Luis Enrique Muñoz

unread,
Jun 11, 2014, 4:18:58 PM6/11/14
to jsp...@googlegroups.com
var conectados = { 
     '1453137': 
     {
          nombre: 'Pepe',
          correo: 'pe...@mail.com'
     },
     '4269000': 
     {    
          nombre: 'Juan',
          correo: 'ju...@mail.com'
     } 
}


1. Tenemos un objeto con todos los usuarios conectados al sistema.
2. La idea es que cuando un usuario cierra el navegador, se busque el identificador del usuario (el cual es un número) y se elimine del objeto.
3. El problema está en que cuando un usuario cierra el navegador, simplemente se ejecuta el evento "disconnect" de Nodejs pero no tenemos el identificador a la mano para buscar el indice y eliminarlo del objeto en el punto 1
4. Creé un segundo objeto en donde utilizo como identificador el "socket.id" único para cada usuario y le añado el identificador de usuario:
     sockets_almacenados = {}
     sockets_almacenados[socket.id] = identificador
     Este segundo objeto lo uso porque en socket.on("disconnect") no puedo pasarle una sesión, pero sí puedo hacer uso de objetos globales.
5. Dentro de socket.on("disconnect") hago lo siguiente:
     var idcon = sockets_almacenados[socket.id];
     así obtengo el identificador y puedo acceder al objeto global con los usuarios conectados, lo busco y lo elimino así:
     delete conectados[idcon];

Esto hace que mi objeto conectados quede así: {}


Básicamente ese es su funcionamiento... Alguna idea?

Alvaro Pereyra Rabanal

unread,
Jun 11, 2014, 4:24:35 PM6/11/14
to jsp...@googlegroups.com, ricky...@gmail.com
Ese es un caso ligeramente distinto :P. 

Veo varios puntos donde podría algo fallar. ¿Has probado verificando qué valor tiene "conectados" antes que borres el contenido?

¿Estas seguro que lo defines de forma global? (lo digo por el "var" al iniciarlo, pero no sé si ese código es real o en qué contexto se ejecuta )

Luis Enrique Muñoz

unread,
Jun 11, 2014, 4:30:59 PM6/11/14
to Alvaro Pereyra Rabanal, jsp...@googlegroups.com
Sí claro que si, hago un console.log antes de eliminar el elemento y se ven ambos usuarios, luego de eliminar (sorry no mencioné esto) se ve solo un usuario (el no eliminado) --- parece funcionar, pero cuando presiono F5 en la ventana del usuario que supuestamente está conectado simplemente la aplicación se cae, ya que no hay propiedades pues el objeto está limpio... Miren el ejemplo que les dí es el que creo es correcto, pero les paso el archivo (es bien grande), pero les  menciono que la creación del objeto está en las líneas:
139
192
216

y luego envía datos al usando el objeto en:

1034

y cuando cierra el usuario el navegador en:

1058

Ojala pueda ayudarme compañeros, muchas gracias y perdonen la molestia.
lanzador.js

Nicolas Valcarcel

unread,
Jun 11, 2014, 4:38:26 PM6/11/14
to jsp...@googlegroups.com, Alvaro Pereyra Rabanal
Cambia el codigo en las linea 1060 por esto:

console.log(idcon)
console.log(conectados)
delete conectados[idcon]
console.log(conectados);

Que obtienes?

Por otro lado, cual es la diferencia entre disconnect y 'salida_usuario’?
> Has recibido este mensaje porque estás suscrito al grupo "JavaScript Perú" de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a jsperu+un...@googlegroups.com.
> Para acceder a más opciones, visita https://groups.google.com/d/optout.
> <lanzador.js>

Luis Enrique Muñoz

unread,
Jun 11, 2014, 4:44:51 PM6/11/14
to jsp...@googlegroups.com, Alvaro Pereyra Rabanal
salida_usuario es cuando el usuario hace clic en "salir", en el cliente, entonces mediante un socket.emit (desde el cliente) envío esa orden elimino el id (aquí si funciona -- es que explicar todo esto es imagina te todo un loquerío, el codigo ha crecido mucho) y luego regreso la orden al cliente y el cliente hace una redirección hacia a fuera.

El resultado de lo que me pides arroja lo siguiente:

87618
{ '87618': 
   { nombre_completo: 'JAVIER ANTONIO ALVA LOAYSA',
     avatar: 'avatar_15.png',
     correo: 'cre...@gmail.com',
     correo_alternativo: '',
     colegio: 'ALFONSO UGARTE',
     id_usuario: 4,
     id_colegio: 1,
     id_libro: 6,
     libros: [ [Object], [Object], [Object] ],
     id_grado: 1,
     id_seccion: 4,
     seccion: 'UNICA',
     id_dep: 14,
     id_pro: 1,
     id_dis: 24,
     departamento: 'LIMA',
     comunidad_chat: 'local',
     sala_chat: 'chat_1_6',
     comunidad_post: 'local',
     sala_post: 'post_1_6',
     nivel_acceso: 2 },
  '1485493': 
   { nombre_completo: 'BELEN NOHEMI',
     avatar: 'avatar_15.png',
     correo: 'est...@caminoangosto.com',
     correo_alternativo: '',
     correo_profesor: 'prof.p...@hotmail.com',
     colegio: 'EBIOLIBROS',
     id_usuario: 21,
     id_colegio: 4,
     id_libro: 1,
     libros: [ [Object] ],
     id_grado: 1,
     id_seccion: 5,
     seccion: 'UNICA',
     id_dep: 14,
     id_pro: 1,
     id_dis: 24,
     departamento: 'LIMA',
     comunidad_chat: 'local',
     sala_chat: 'chat_4_1',
     comunidad_post: 'local',
     sala_post: 'post_4_1',
     nivel_acceso: 1 } }
{ '1485493': 
   { nombre_completo: 'BELEN NOHEMI',
     avatar: 'avatar_15.png',
     correo: 'est...@caminoangosto.com',
     correo_alternativo: '',
     correo_profesor: 'prof.p...@hotmail.com',
     colegio: 'EBIOLIBROS',
     id_usuario: 21,
     id_colegio: 4,
     id_libro: 1,
     libros: [ [Object] ],
     id_grado: 1,
     id_seccion: 5,
     seccion: 'UNICA',
     id_dep: 14,
     id_pro: 1,
     id_dis: 24,
     departamento: 'LIMA',
     comunidad_chat: 'local',
     sala_chat: 'chat_4_1',
     comunidad_post: 'local',
     sala_post: 'post_4_1',
     nivel_acceso: 1 } }

Un detalle, el numero arriba es justamente un "number"  y no un string, eso tendrá que ver?


Para obtener más opciones, visita https://groups.google.com/d/optout.

Nicolas Valcárcel

unread,
Jun 11, 2014, 4:55:23 PM6/11/14
to jsp...@googlegroups.com, Alvaro Pereyra Rabanal
De hecho, el script esta haciendo exactamente lo que debe hacer:
On 11/06/2014, at 15:44, Luis Enrique Muñoz <ricky...@gmail.com> wrote:

idconn:
> 87618

Contectados antes del delete:
Conectados despues del delete:

> { '1485493':
> { nombre_completo: 'BELEN NOHEMI',
> avatar: 'avatar_15.png',
> correo: 'est...@caminoangosto.com',
> correo_alternativo: '',
> correo_profesor: 'prof.p...@hotmail.com',
> colegio: 'EBIOLIBROS',
> id_usuario: 21,
> id_colegio: 4,
> id_libro: 1,
> libros: [ [Object] ],
> id_grado: 1,
> id_seccion: 5,
> seccion: 'UNICA',
> id_dep: 14,
> id_pro: 1,
> id_dis: 24,
> departamento: 'LIMA',
> comunidad_chat: 'local',
> sala_chat: 'chat_4_1',
> comunidad_post: 'local',
> sala_post: 'post_4_1',
> nivel_acceso: 1 } }

El error esta en otro lado, no estara re-inicializando la variable conectados despues del ‘disconnect'?
---
Nicolas Valcárcel
Gerente IT / CTO

Luis Enrique Muñoz

unread,
Jun 11, 2014, 4:59:17 PM6/11/14
to jsp...@googlegroups.com, Alvaro Pereyra Rabanal
No, como verás, cuando un usuario se desconecta, simplemente envío a todos los usuarios del sistema la lista de usuarios actualmente conectados (para actualizar la lista), luego, si un usuario presiona F5, lo único que el sistema hace es reenviarle sus datos de contacto indicando el "idcon" en la línea 1041.

Es realmente un acertijo terrible...

Nicolas Valcarcel

unread,
Jun 11, 2014, 5:00:00 PM6/11/14
to jsp...@googlegroups.com, Alvaro Pereyra Rabanal
De hecho, el script esta haciendo exactamente lo que debe hacer:

On 11/06/2014, at 15:44, Luis Enrique Muñoz <ricky...@gmail.com> wrote:

idconn:
> 87618

conectados antes del delete:
conectados despues del delete:
> { '1485493':
> { nombre_completo: 'BELEN NOHEMI',
> avatar: 'avatar_15.png',
> correo: 'est...@caminoangosto.com',
> correo_alternativo: '',
> correo_profesor: 'prof.p...@hotmail.com',
> colegio: 'EBIOLIBROS',
> id_usuario: 21,
> id_colegio: 4,
> id_libro: 1,
> libros: [ [Object] ],
> id_grado: 1,
> id_seccion: 5,
> seccion: 'UNICA',
> id_dep: 14,
> id_pro: 1,
> id_dis: 24,
> departamento: 'LIMA',
> comunidad_chat: 'local',
> sala_chat: 'chat_4_1',
> comunidad_post: 'local',
> sala_post: 'post_4_1',
> nivel_acceso: 1 } }

El error esta en otro lado, no estara re-inicializando la variable conectados despues del 'disconnect'?

Nicolas Valcarcel

unread,
Jun 11, 2014, 5:02:20 PM6/11/14
to jsp...@googlegroups.com
El problema es que el codigo es una maraña indescifrable, lo que lo hace dificil de leer y debugear. Limpia y ordena el código, revisa bien que esta pasando, porque del ‘disconnect’ sale la variable como deberia salir, asi que el error esta pasando en otro lado, el delete funciona bien, tu log lo confirma. Debes estar chancando la variable en otro lado.
Nicolas Valcarcel
a.k.a. nxvl

Luis Enrique Muñoz

unread,
Jun 11, 2014, 5:03:30 PM6/11/14
to jsp...@googlegroups.com
Ok entonces voy a revisar bien y les aviso.
Gracias Nicolas.
Reply all
Reply to author
Forward
0 new messages