Как использовать метод цепочки подчеркивания для возврата первого элемента в многомерном массиве?

Скажем, у меня есть массив массивов, и я хочу вернуть первый элемент каждого массива в массиве:

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

Я знаю, что могу сделать что-то вроде этого:

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

но что, если я хочу сделать это с помощью метода подчеркивания _.chain()? Просто изучение подчеркивания, и до сих пор кажется очень полезным.

Ответ 1

Вы можете сделать это с помощью flatten и map:

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

Демо: http://jsfiddle.net/ambiguous/cm3CJ/

Вы используете flatten(true) для преобразования массива массивов массивов в массив массивов, а затем map удаляет первый элемент каждого внутреннего массива.

Если вы хотите что-то короче map, вы можете использовать pluck, чтобы вытащить первый элемент внутренних массивов:

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

Демо: http://jsfiddle.net/ambiguous/pM9Hq/

_.pluck - это всего лишь вызов map:

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

Этот выглядит намного больше как .map(&:first), который вы использовали бы в Ruby, чтобы он мог быть более знаком некоторым людям и более кратким, как только вы привыкли к pluck. Если вы действительно хотите что-то Rubyish, вы можете использовать не анонимную функцию с map:

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