2012-05-17 5 views
10

Dire che ho un array di array, e voglio restituire il primo elemento di ciascun array all'interno della matrice:Come si usa il metodo della catena di sottolineatura per restituire il primo elemento in una matrice multidimensionale?

array = [[["028A","028B","028C","028D","028E"], 
      ["028F","0290","0291","0292","0293"], 
      ["0294","0295","0296","0297","0298"], 
      ["0299","029A","029B","029C","029D"], 
      ["029E","029F","02A0","02A1","02A2"]], 
     [["02A3","02A4"], 
      ["02A5", "02A6"]]; 

so di poter fare qualcosa di simile:

var firsts = []; 
_.each(array, function(item){ 
    _.each(item, function(thisitem){ 
    firsts.push(_.first(thisitem)); 
    }); 
}); 

ma cosa se voglio farlo con il metodo di sottolineatura _.chain()? Basta imparare a sottolineare, e finora sembra molto utile.

risposta

29

Si potrebbe farlo con flatten e map così:

var firsts = _.chain(array) 
       .flatten(true) // This true is important. 
       .map(function(a) { return a[0] }) 
       .value(); 

Demo: http://jsfiddle.net/ambiguous/cm3CJ/

si utilizza flatten(true) per convertire la matrice-di-array-di-array in un array-di-array e quindi lo map rimuove il primo elemento di ogni array interno.

Se volete qualcosa di più corto del map, si potrebbe usare pluck per estrarre il primo elemento delle matrici interne:

var firsts = _.chain(array) 
       .flatten(true) // This true is important. 
       .pluck(0) 
       .value(); 

Demo: http://jsfiddle.net/ambiguous/pM9Hq/

_.pluck è solo una chiamata map in ogni caso:

// Convenience version of a common use case of `map`: fetching a property. 
_.pluck = function(obj, key) { 
    return _.map(obj, function(value){ return value[key]; }); 
}; 

Questo assomiglia molto di più allo .map(&:first) che useresti in Ruby quindi potrebbe essere più familiare ad alcune persone e più conciso una volta che sarai abituato a pluck. Se si vuole veramente qualcosa Rubyish, è possibile utilizzare una funzione non anonima con map:

var first = function(a) { return a[0] }; 
var firsts = _.chain(array) 
       .flatten(true) // This true is important. 
       .map(first) 
       .value(); 
+2

ho trovato l'uso di ** ** coraggio molto interessante in questo contesto. Spiana la strada per estrarre _secondi_, _thirds_ e così via. La soluzione Rubish, usando ** underscore ** sin dall'inizio, poteva usare come prima riga il seguente codice: 'var first = function (a) {return _.first (a); }; ' –

+1

@ChaosManor: Non avresti nemmeno bisogno di' prima' nella tua sottolineatura ha '_.first', potresti solo dire' .map (_. Prima) '. –

Problemi correlati