2011-01-08 3 views
23

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

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

результата = (generate_array (х) для x in arr)

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

ответ

47

Просто используйте 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 ] 
+0

приятно. Не знал, что это будет так лаконично. Благодарю. –

+0

, что идиома блестящая- Спасибо, что заставило меня осознать это! – drcode

+11

Для таких, как я, которые не получают его сразу, второй аргумент 'apply' - это список, в котором каждый элемент в списке становится аргументом, переданным функции. Итак, для [[1,2,3], [4,5,6], [7,8,9]] вы по существу вызываете [] .concat ([1,2,3], [4,5,6 ], [7,8,9]). –

5

ОК, один из способов - включить библиотеку 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 делает то же самое.

5

Что об этом для кофе

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

'.reduce (a, b) -> [a ..., b ...]' coffier – fracz

Смежные вопросы