2011-12-15 27 views
8

lọc hoạt động tốt cho một đối tượng (data) quấn xung quanh một mảng của các đối tượng:

var arr = {"data": 
[ 
    {"name":"Alan","height":"171","weight":"66"}, 
    {"name":"Ben","height":"182","weight":"90"}, 
    {"name":"Chris","height":"163","weight":"71"} 
] 
}; 

var new_arr = $.extend(true, arr); 

new_arr.data = $.grep(new_arr.data, function(n, i){ 
    return n.weight > 70; 
}); 

alert(new_arr.data.length); // answer is 2 

Tuy nhiên, chọn lọc mà không có đối tượng wrapper không .

var arr = [ 
    {"name":"Alan","height":"171","weight":"66"}, 
    {"name":"Ben","height":"182","weight":"90"}, 
    {"name":"Chris","height":"163","weight":"71"} 
]; 

var new_arr = $.extend(true, arr); 

new_arr = $.grep(new_arr, function(n, i){ 
    return n.weight > 70; 
}); 

alert(new_arr.length); // answer is 1 instead of 2 

Tôi không chắc vấn đề ở đâu. Bất cứ ai có thể chỉ ra. Cảm ơn!

Trả lời

8

Bạn đang sử dụng extend không chính xác. Bạn không thể mở rộng new_arr với một mảng. Mở rộng sẽ thêm các phương thức/đạo cụ vào một đối tượng nhưng các phương thức/đạo cụ nào sẽ tạo ra khi nó chạy vào mảng của bạn? Đây là lý do tại sao nó làm việc với các wrapper đối tượng: 1) mở rộng hy vọng một đối tượng và 2) 'dữ liệu' là một tài sản có thể được thêm vào new_arry.

Mặc dù, trong ví dụ thứ hai của bạn, có vẻ như bạn không cần phải mở rộng bất kỳ thứ gì. Điều này có hiệu quả không?

new_arr = $.grep(arr, function(n, i){ // just use arr 
    return n.weight > 70; 
}); 
+0

Tôi vừa phát hiện ra lý do quá :) Tôi quên lý do tại sao tôi đã sử dụng mở rộng ở nơi đầu tiên. Có vẻ như tôi không cần nó bây giờ. Cảm ơn rất nhiều :) –

0

Bạn có thể sử dụng cho một đối tượng sâu hơn,

var prodIds = []; 

     $.grep(this.prodOrders, function (n, i) { 

      $.grep(n.ProductionOrderLines, function (n2, i2) { 
       if (n2.ItemNo == resource) { 
        prodIds.push(n2.DocumentAbsoluteEntry); 
       } 
      }); 
     }); 
Các vấn đề liên quan