2013-02-27 15 views
8

Musiałbym dodać kilka tablic w zależności od elementu. Oznacza to, że mam kilka tablic o jednakowej długości i potrzebuję jednego z taką samą liczbą elementów, które są sumą danych wejściowych. Podkreślenie ma metody składania wszystkich elementów w jeden i mapowania każdego elementu za pomocą funkcji, ale nie mogę znaleźć żadnego sposobu na połączenie dwóch macierzy.Odwzorowywanie dwóch (lub więcej) tablic na jeden z underscore.js

Jeśli moje oryginalne tablice były [1,2,3,4,5,6], [1,1,1,1,1,1] i [2,2,2,2,2,2], wynik powinien wynosić [4,5,6,7,8,9].

Wiem, że mogę to zrobić przez iterowanie po tablicach, ale zastanawiam się, czy byłoby łatwiej/szybciej za pomocą funkcji underscore.js. Czy mogę to zrobić? W jaki sposób?

Odpowiedz

10

Łatwiej tak, szybciej nie. Emulować zipWith można połączyć zip z podsu- reduce:

var arrays = [[1,2,3,4,5,6], [1,1,1,1,1,1], [2,2,2,2,2,2]]; 

_.map(_.zip.apply(_, arrays), function(pieces) { 
    return _.reduce(pieces, function(m, p) {return m+p;}, 0); 
}); 
+0

To jest idealne. Działa we wszystkich moich scenariuszach i jest wystarczająco szybki. Zamierzam porównać to z bezpośrednią iteracją, ale wygląda świetnie. Dziękuję Ci. –

+0

@Bergi Nie rozumiem notacji apply (_,) Do jakiej funkcji underscorejs jest to _ związane z? –

+0

@StephaneRolland: '_' tutaj jest sam obiekt podkreślenia. Sprawdź, co ['fn.apply'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) robi z argumentami ... Właściwie mogliśmy również przekazać 'null'. – Bergi

5

Nie sądzę, że byłoby łatwiej z podkreśleniem. Oto dwie opcje:

var a = [1,2,3,4,5,6] 
    , b = [1,1,1,1,1,1] 
    , c = [2,2,2,2,2,2]; 

var result = a.map(function(_,i) { 
    return a[i] + b[i] + c[i]; 
}); 

// OR 

var result = []; 
for (var i = 0; i < a.length; i++) { 
    result.push(a[i] + b[i] + c[i]); 
} 

console.log(result); //=> [4,5,6,7,8,9] 
+1

Druga wersja jest tym, czego używam teraz. Jedynym problemem jest to, że chociaż działa dobrze dla dwóch lub trzech tablic, jest to koncepcyjnie ograniczone, gdy jest ich jeszcze kilka. Moim pierwotnym pomysłem było zbudowanie tablicy tablic i - jakoś - mapowanie ich na wszystkie elementy. W każdym razie twoje pierwsze rozwiązanie wygląda obiecująco. Spróbuję go rozszerzyć. –

0

Można wykorzystać suwak w połączeniu z mapą i ograniczenia: nie testowano, ale coś takiego może działać

var result = _.map(_.zip(array1, array2, array3),function(zipped){return _.reduce(zipped, function(memo, num){ return memo + num; }, 0)}); 
+0

brak kropki po pierwszym podkreśleniu :). Twoje rozwiązanie jest prawie takie samo, jak napisał Bergi, ale używa Vipa Zipa. Zip._apply nie daje mi poprawnych odpowiedzi. Muszę wrócić do dokumentacji, aby znaleźć powód. Dziękuję bardzo. –

+0

Poprawię to. – benzonico

3

Zamiast podkreślenia można użyć skrótu lodash (https://lodash.com/), który ma całkiem fajny operator zipWith (https://lodash.com/docs#zipWith), który działałby jak przykład poniżej. (uwaga _.add jest także funkcją matematyczną dla lamash)

var a = [1,2,3,4,5,6] 
    , b = [1,1,1,1,1,1] 
    , c = [2,2,2,2,2,2]; 

var result = _.zipWith(a, b, c, _.add); 

// result = [4, 5, 6, 7, 8, 9] 
Powiązane problemy