2015-07-09 4 views
0

У меня есть один интересный вопрос. Может быть, кто-нибудь знает, как я могу реализовать такой метод, как http://ramdajs.com/docs/#xprod. У меня есть одно решение, которое я нашел:Вычислить декартово произведение (метод xprod) двух наблюдаемых

let as = [1, 2, 3]; 
let bs = ['a', 'b', 'c']; 

Rx.Observable.for(bs, b => { 
    return Rx.Observable.for(as, a => Rx.Observable.just([a, b])); 
}).toArray().subscribe(x => { 
    console.log(x.sort((a, b) => a[0] - b[0])); 
}); 
+1

Итак, ваше решение работает? Если да, в чем ваш вопрос? – Bergi

+0

Мне нужно лучшее решение. Теперь я должен аккумулировать все данные в последовательности и сортировать в подписке. Но я думаю, что существует другой подход. – xgrommx

+0

Подождите, если вы хотите транспонированный порядок, просто замените 'as' и' bs' на эти '.for' петли? – Bergi

ответ

0

Я согласен с комментарием Бен Леша выше, что, если нет-то асинхронная происходит, вы, вероятно, не нужно использовать Observable.

Простой ES5, на основе массива решение (что эквивалентно внутренней карте Мэтта Podwysocki в solution) может выглядеть следующим образом:

var as  = [1, 2, 3], 
    bs  = ['a', 'b', 'c']; 
as.flatMap = flatMap; 

var product = as.flatMap(pairWithAllBs); 

// pairWithAllBs :: Number -> [[Number, String]] 
function pairWithAllBs(a) { 
    return bs.map(function (b) { 
     return [a, b]; 
    }); 
} 

// flatMap :: @[a], (a -> [b]) -> [b] 
// JS does not have a built-in flatMap function. 
function flatMap(fn) { 
    return Array.prototype.concat.apply([], this.map(fn)); 
} 

В ES7, используя array comprehensions, мы должны быть в состоянии просто сделать:

[for (a of as) for (b of bs) [a, b]]; 
+0

Я знаю, как это можно реализовать в vanilla js =) – xgrommx

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