2012-05-17 7 views
10

Decir que tengo una matriz de matrices, y quiero devolver el primer elemento de cada matriz dentro de la matriz:¿Cómo se usa el método de cadena de subrayado para devolver el primer elemento en una matriz multidimensional?

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"]]; 

Sé que puedo hacer algo como esto:

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

pero lo si quiero hacerlo con el método de subrayado _.chain()? Solo estoy aprendiendo el guión bajo, y hasta ahora parece muy útil.

Respuesta

29

Se podía hacerlo con flatten y map así:

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

Demostración: http://jsfiddle.net/ambiguous/cm3CJ/

Se utilizan flatten(true) para convertir su gama de arrays de arrays en una matriz-de-arrays y luego el map pela el primer elemento de cada matriz interna.

Si quieres algo más corto que el map, podría utilizar pluck de sacar el primer elemento de las matrices internas:

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

Demostración: http://jsfiddle.net/ambiguous/pM9Hq/

_.pluck es sólo una llamada map de todos modos:

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

Esta se parece mucho más a la .map(&:first) que usaría en Ruby, por lo que podría ser más familiar para algunas personas y más conciso una vez que esté acostumbrado al pluck. Si realmente quieres algo Rubyish, se puede usar una función no anónima con map:

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

me encontré con el uso de desplumar ** ** muy interesante en este contexto. Allana el camino para extraer _seconds_, _thirds_, y así sucesivamente. La solución Rubish, usando ** guión bajo ** desde el principio, podría usar como primera línea el siguiente código: 'var first = function (a) {return _.first (a); }; ' –

+1

@ChaosManor: Ni siquiera necesitarías' first' en tu Underscore tiene '_.first'; podrías simplemente decir' .map (_. First) '. –

Cuestiones relacionadas