2015-09-06 3 views
7

Con la funzione di sottolineatura groupBy, una matrice può essere raggruppata per una delle proprietà dell'elemento. Il risultato è un oggetto che ha coppie chiave-valore come segue: gruppo> corrispondente frammento di array.itera su un oggetto recuperato da _.groupBy

var words = ['Hey', 'Hii', 'Salut'], 
    grouped = _.groupBy(words, 'length'); 

sguardi raggruppati come questo:

{ 
    '3': ['Hey', 'Hii'], 
    '5': ['Salut'] 
} 

che sarebbe un modo semplice e sicuro per iterare questo, dicono a cominciare dalla lunghezza massima seguito dal successivo più basso. Questo funziona:

_.each(_.toArray(grouped).reverse(), function(v) { 
    console.log(v); 
}); 

ma penso che non è del tutto corretto, perché gli oggetti sono liste non ordinate, e il giusto ordine accade qui solo per caso. Eventuali commenti su questo?

risposta

5

Hai ragione nel fatto che non puoi fare affidamento sull'ordinamento delle chiavi oggetto, devi applicare l'ordinamento giusto. Con sottolineatura è possibile utilizzare _.sortBy:

_.each(
    _.sortBy(
     _.toArray(grouped), function (num) { 
      return num; 
     } 
    ).reverse(), 
    function (v) { 
     console.log(v); 
    } 
); 
4

Questo può essere fatto in js puri:

Object.keys(grouped) // get the keys as array 
    .sort(function(a, b) { return b - a; }) // sort them from highest to lowset 
    .forEach(function(lengthKey) { // iterate the sorted keys' array 
     console.log(grouped[lengthKey]); // get the words' arrays by key from grouped 
    });