2012-05-21 11 views
6

Tengo problemas para borrar this (un 'evento' específico) del siguiente objeto javascript, cuando this es de un jquery .each() loop.Eliminar esto de un objeto javascript en jQuery .each()

WeatherData:

{ 
    "events":{ 
     "Birthday":{ 
      "type":"Annual", 
      "date":"20120523", 
      "weatherType":"clouds", 
      "high":"40", 
      "low":"30", 
      "speed":"15", 
      "direction":"0", 
      "humidity":"0" 
     }, 
     "Move Out Day":{ 
      "type":"One Time", 
      "date":"20120601", 
      "weatherType":"storm", 
      "high":"80", 
      "low":"76", 
      "speed":"15", 
      "direction":"56", 
      "humidity":"100" 
     } 
    }, 
    "dates":{ 
     "default":{ 
      "type":"clouds", 
      "high":"40", 
      "low":"30", 
      "speed":"15", 
      "direction":"0", 
      "humidity":"0" 
     }, 
     "20120521":{ 
      "type":"clear", 
      "high":"60", 
      "low":"55", 
      "speed":"10", 
      "direction":"56", 
      "humidity":"25" 
     } 
    } 
} 

Ésta es una versión encogida del bucle .each():

$.each(weatherData.events, function(i){ 
    if(this.type == "One Time"){ 
     delete weatherData.events[this]; 
    } 
}) 
+0

que podría ser mejor, simplemente vaciando weatherData.events (weatherData.events = {}), en lugar de tratar de eliminarlo. De acuerdo con uno de los autores de v8 en una entrevista que escuché recientemente, cuando borras el miembro de un objeto, el objeto se convierte de nuevo en un hash, luego vuelve a un objeto, mientras que la reasignación dentro de un objeto no tiene el objeto-> hash -> penalizaciones de rendimiento del objeto. – BrianFreud

+0

Eso suena como un buen consejo. Haría eso si no estuviera tratando de guardar algunos de los contenidos. Solo borré ciertos eventos, no todos. Actualizaré mi publicación para ser más específica en la descripción de apertura. – fishpen0

Respuesta

7

Usted está utilizando un objeto donde se espera una cadena (el nombre de la propiedad). Creo que desee:

$.each(weatherData.events, function(i){ 
    if(this.type == "One Time"){ 
     delete weatherData.events[i]; 
     // change is here --------^ 
    } 
}); 

... porque $.each pasará en el nombre de la propiedad (por ejemplo, "Move Out Day") como el primer argumento de la función de repetidor, que usted está aceptando como i. Entonces, para eliminar esa propiedad del objeto, usa ese nombre.

Gratuitous live example | source

+0

Me siento tonto por no probar el iterador cuando incluso me tomé el tiempo para agregarlo a los parámetros de la función. ¡Muchas gracias! – fishpen0

1

Necesita el nombre del elemento, no una referencia al mismo. Utilice los parámetros de la función de devolución de llamada:

$.each(weatherData.events, function(key, value){ 
    if(value.type == "One Time"){ 
    delete weatherData.events[key]; 
    } 
}); 

Ref: http://api.jquery.com/jQuery.each/