Конкатенация массива массивов в Coffeescript - PullRequest
24 голосов
/ 08 января 2011

Я пытаюсь найти элегантный способ в Coffeescript объединить массив массивов, чтобы [[1,2,3], [4,5,6], [7,8,9]] ==> [1,2,3,4,5,6,7,8,9].

Как вы можете себе представить, мне это нужно, потому что я генерирую массивы из функции в "for in"построить и нужно объединить полученный вложенный массив:

result = (generate_array (x) для x в arr)

Есть ли элегантный способ справиться с этим?Спасибо за любые указатели!

Ответы [ 5 ]

49 голосов
/ 08 января 2011

Просто используйте идиому JS:

 [].concat.apply([], a)

, которая становится немного лучше в кофе:

$ coffee -e 'a = [[1,2,3],[4,5,6],[7,8,9]]; console.dir [].concat a...'
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
5 голосов
/ 30 мая 2014

А как насчет кофе

[[1, 2, 3], [4, 5, 6], [7, 8, 9]].reduce (a, b) ->
  a.concat b

или это для чистого Javascript

[[1, 2, 3], [4, 5, 6], [7 , 8, 9]].reduce((a, b) => a.concat(b));
5 голосов
/ 08 января 2011

ОК, один из способов - включить библиотеку underscore.js . Это очень хорошая, легкая, но мощная служебная библиотека, в которой есть _.flatten, которая делает именно это.

За исключением этого, вы можете взять код underscore.js для flatten и изменить его, чтобы удалить любые другие зависимости подчеркивания, чтобы создать свой собственный "flatten".

Вот код "_.flatten" underscore.js:

 _.flatten = function(array) {
   return _.reduce(array, function(memo, value) {
     if (_.isArray(value)) return memo.concat(_.flatten(value));
     memo[memo.length] = value;
     return memo;
   }, []);
 };

Обратите внимание, что он делает некоторые приятные вещи для вас. Например, многие функции подчеркивания, такие как _.reduce, будут проверять, реализована ли в браузере собственная версия, что есть у некоторых. Если это так, он будет использовать нативный, который, конечно, работает намного быстрее. Реализация _.isArray делает то же самое.

0 голосов
/ 26 июня 2015

Почему бы не попробовать Lodash?

_.flatten([1,2,3], [4,5,6]) => [1,2,3,4,5,6]

https://lodash.com/docs#flatten

0 голосов
/ 06 июля 2012

sugarjs - это еще один элегантный способ сделать это:

[[1, 2, 3]].flatten() //=> [1, 2, 3]

sugarjs: сгладить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...