如何使用下划线的链方法来返回多维数组中的第一项?

时间:2022-10-08 21:21:48

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.

但是,如果我想使用下划线的_.chain()方法怎么办?只是学习下划线,到目前为止看起来很有用。

1 个解决方案

#1


29  

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/

演示: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.

您使用flatten(true)将数组的数组数组数组转换成数组的数组数组数组,然后映射剥离每个内部数组的第一个元素。

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/

演示: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:

这个看起来更像你在Ruby中使用的.map(&:first),所以有些人可能更熟悉它,一旦你习惯了使用它,它会更简洁。如果你真的想要一些Rubyish,你可以使用一个非匿名函数和map:

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

#1


29  

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/

演示: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.

您使用flatten(true)将数组的数组数组数组转换成数组的数组数组数组,然后映射剥离每个内部数组的第一个元素。

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/

演示: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:

这个看起来更像你在Ruby中使用的.map(&:first),所以有些人可能更熟悉它,一旦你习惯了使用它,它会更简洁。如果你真的想要一些Rubyish,你可以使用一个非匿名函数和map:

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