2012-05-21 20 views
6

Tôi gặp sự cố khi xóa this (một sự kiện 'cụ thể') từ đối tượng javascript sau, khi this là từ vòng lặp jquery .each().Xóa điều này khỏi một đối tượng javascript trong 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" 
     } 
    } 
} 

Đây là một phiên bản teo của .each() loop:

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

Bạn có thể tốt hơn chỉ đơn giản là đổ weatherData.events (weatherData.events = {}), chứ không phải cố gắng để xóa nó. Theo một trong những tác giả của v8 trong một cuộc phỏng vấn tôi đã nghe gần đây, khi bạn xóa một thành viên của đối tượng, đối tượng được chuyển đổi thành băm, sau đó trở lại một đối tượng, trong khi gán lại trong một đối tượng không có đối tượng-> băm -> đối tượng thực hiện hình phạt. – BrianFreud

+0

Điều đó nghe như lời khuyên tốt. Tôi sẽ làm điều đó nếu tôi không cố gắng tiết kiệm một số nội dung. Tôi chỉ xóa một số sự kiện nhất định chứ không phải tất cả các sự kiện. Tôi sẽ cập nhật bài đăng của mình để cụ thể hơn trong phần mô tả mở đầu. – fishpen0

Trả lời

7

Bạn đang sử dụng một đối tượng mà một chuỗi (tên tài sản) được mong đợi. Tôi tin rằng bạn muốn:

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

... vì $.each sẽ vượt qua trong các tên thuộc tính (ví dụ, "Move Out Day") như là đối số đầu tiên với chức năng lặp, mà bạn đang chấp nhận như i. Vì vậy, để xóa thuộc tính đó khỏi đối tượng, bạn sử dụng tên đó.

Gratuitous live example | source

+0

Tôi cảm thấy ngu ngốc khi không cố gắng lặp lại khi tôi thậm chí còn dành thời gian để thêm nó vào các tham số chức năng. Cảm ơn rất nhiều! – fishpen0

1

Bạn cần tên của mục, không phải là tham chiếu đến mục đó. Sử dụng các thông số trong hàm callback:

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

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

Các vấn đề liên quan