Monday, May 20, 2024
102
rated 0 times [  108] [ 6]  / answers: 1 / hits: 24754  / 12 Years ago, thu, may 17, 2012, 12:00:00

Say I have an array of arrays, and I want to return the first element of each array within the array:



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


I know I can do something like this:



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


but what if I want to do it with underscore's _.chain() method? Just learning underscore, and so far seems very useful.


More From » underscore.js

 Answers
24

You could do it with flatten and map thusly:



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


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



You use flatten(true) to convert your array-of-arrays-of-arrays into an array-of-arrays and then the map peels off the first element of each inner array.



If you want something shorter than the map, you could use pluck to pull out the first element of the inner arrays:



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


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



_.pluck is just a map call anyway:



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


This one looks a lot more like the .map(&:first) that you'd use in Ruby so it might be more familiar to some people and more concise once you're used to pluck. If you really want something Rubyish, you could use a non-anonymous function with map:



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

[#85516] Wednesday, May 16, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
gonzaloulyssess

Total Points: 225
Total Questions: 114
Total Answers: 112

Location: Iraq
Member since Fri, Jun 5, 2020
4 Years ago
;