Ответ 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 ]
Я пытаюсь найти элегантный способ в 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)
Есть ли элегантный способ справиться с этим? Спасибо за любые указатели!
Просто используйте 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 ]
ОК, одним из способов является включение библиотеки 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 делает то же самое.
Как насчет этого для кофе
[[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));
sugarjs - еще один способ сделать это:
[[1, 2, 3]].flatten() //=> [1, 2, 3]
Почему бы не попробовать использовать Lodash?
_.flatten([1,2,3], [4,5,6]) => [1,2,3,4,5,6]