2011-12-15 7 views
8

filtraggio funziona bene per un oggetto (data) incarto attorno ad un array di oggetti:

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 

Tuttavia, filtrando senza l'involucro oggetto no .

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 

Non sono sicuro di dove sia il problema. Qualcuno può sottolineare. Grazie!

risposta

8

Si sta utilizzando extend in modo errato. Non puoi estendere il new_arr con un array. Estendi aggiungerà metodi/oggetti di scena a un oggetto, ma quali metodi/oggetti di scena creerà quando viene eseguito nell'array? Questo è il motivo per cui funziona con il wrapper degli oggetti: 1) estensione si aspetta un oggetto e 2) "dati" è una proprietà che può essere aggiunta a new_arry.

Nonostante, nel tuo secondo esempio, non sembra che sia necessario estendere nulla. funziona?

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

Ho appena scoperto la ragione troppo :) Ho dimenticato il motivo per cui ho usato si estendono, in primo luogo. Sembra che non ne abbia più bisogno ora. Molte grazie :) –

0

È possibile utilizzare questo per un oggetto più profondo,

var prodIds = []; 

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

      $.grep(n.ProductionOrderLines, function (n2, i2) { 
       if (n2.ItemNo == resource) { 
        prodIds.push(n2.DocumentAbsoluteEntry); 
       } 
      }); 
     }); 
Problemi correlati