How do you use underscore's chain method to return the first item in a multidimensional array?
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();
![Chris Matta](https://i.stack.imgur.com/n9veo.jpg?s=256&g=1)
Chris Matta
Updated on July 15, 2022Comments
-
Chris Matta almost 2 years
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. -
Chaos Manor about 10 yearsI found the use of pluck very interesting in this context. It paves the way for extracting seconds, thirds, and so on. The Rubish solution, using underscore since the very beginning, could use as first line the following code:
var first = function(a) { return _.first(a); };
-
mu is too short about 10 years@ChaosManor: You wouldn't even need
first
in your Underscore has_.first
, you could just say.map(_.first)
.