Подтвердить что ты не робот

Объединение массива массивов в Coffeescript

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

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

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

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

4b9b3361

Ответ 1

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

 [].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 ]

Ответ 2

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

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

Здесь код underscore.js "_.flatten":

 _.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 делает то же самое.

Ответ 3

Как насчет этого для кофе

[[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));

Ответ 4

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

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

sugarjs: flatten

Ответ 5

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

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

https://lodash.com/docs#flatten