Объединение массива массивов в CoffeeScript
-
08-10-2019 - |
Вопрос
Я пытаюсь найти элегантный путь в CoffeeScript, чтобы объединить массив массивов, чтобы [[1,2,3], [4,5,6], [7,8,9]] ==> [1 2,3,4,5,6,7,8,9].
Как вы можете себе представить, мне это нужно, потому что я генерирую массивы из функции в конструкции «для» и надо объединять полученный вложенный массив:
Результат = (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]