Вопрос

Я пытаюсь найти элегантный путь в 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]

Sugarjs: Flatten

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

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

https://lodash.com/docs#flatten.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top