2011-01-08 17 views
23

Próbuję znaleźć elegancki sposób w Coffliscriptu, aby połączyć tablicę tablic, dzięki czemu [[1,2,3], [4,5,6], [7, 8,9]] ==> [1,2,3,4,5,6,7,8,9].Łączenie tablic tablic w Coffeescript

Jak można sobie wyobrazić, muszę to bo jestem generowanie tablic z funkcji w „w” skonstruować i trzeba złączyć wynikowy tablicę zagnieżdżonego:

wynik = (generate_array (x) dla x w arr)

Czy istnieje elegancki sposób poradzenia sobie z tym? Dzięki za wszelkie wskazówki!

Odpowiedz

47

Wystarczy użyć idiomu JS:

[].concat.apply([], a) 

który staje się trochę ładniejszy w Kawa:

$ 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

miłe. Nie wiedziałem, że to będzie tak zwięzłe. Dzięki. –

+0

ten idiom jest genialny - dzięki za uświadomienie mi tego! – drcode

+11

Dla tych, którzy mnie nie dostają od razu, drugim argumentem 'apply' jest lista, w której każdy element na liście staje się argumentem przekazanym do funkcji. Tak więc dla [[1,2,3], [4,5,6], [7,8,9]] zasadniczo wołasz [] .concat ([1,2,3], [4,5,6] ], [7,8,9]). –

5

OK, jednym ze sposobów jest dołączenie biblioteki underscore.js. Jest to bardzo ładna, lekka, ale potężna biblioteka narzędziowa i ma _.flatten, która robi dokładnie to.

Jeśli to zrobisz, możesz użyć kodu underscore.js do spłaszczenia i zmodyfikować go, aby usunąć wszelkie inne zależności podkreślenia, aby utworzyć własne, niezależne "spłaszczanie".

Oto underscore.js "_.flatten" Kod:

_.flatten = function(array) { 
    return _.reduce(array, function(memo, value) { 
    if (_.isArray(value)) return memo.concat(_.flatten(value)); 
    memo[memo.length] = value; 
    return memo; 
    }, []); 
}; 

Zauważ, że robi jakieś ładne rzeczy dla Ciebie. Na przykład wiele funkcji podkreślenia, takich jak _.reduce, sprawdzi, czy przeglądarka zaimplementowała natywną wersję, którą niektórzy mają. Jeśli tak, użyje natywnego, który oczywiście działa znacznie szybciej. Implementacja _.isArray robi to samo.

5

Co o tym na kawę

[[1, 2, 3], [4, 5, 6], [7, 8, 9]].reduce (a, b) -> 
    a.concat b 

czy to dla czystej JavaScript

[[1, 2, 3], [4, 5, 6], [7 , 8, 9]].reduce((a, b) => a.concat(b)); 
+1

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