2016-07-27 14 views
0

配列全体を反復処理し、他の配列内の対応するオブジェクトを見つけ、結果をオブジェクトにマージする必要があります。私は私が持っているしたいという入れ子になったオブザーバブルを持たない複数の配列を反復する方法

var usersObservable = RX.Observable.fromArray(users); 
var typesObservable = Rx.Observable.fromArray(types); 
var levelsOBservable = Rx.Observable.fromArray(levels); 

var uiUsers= [];// not really needed because I will use the same users array again. 

usersObservable.map(function(user) { 
     typesObservable.filter(function(type) { 
     return type.id == user.type; 
    }).subscribeOnNext(function(userType) { 
     user.typeDescription = userType.description; 
    }); 
    return user; 
}).map(function(user) { 
     levelsOBservable.filter(function(level) { 
     return level.id == user.levelId; 
    }).subscribeOnNext(function(level) { 
     user.levelDescription = level.description; 
    }); 
    return user; 
}) 
.subscribeOnNext(function(user) { 
    uiUsers.push(user); 
}) 

のようにそれを達成することができます知っている

var users = [ 
    { name: "A", type: 2, level: 1, levelDescription: "Level 1", typeDescription: "Type 2" }, 
    { name: "B", type: 1, level: 2, levelDescription: "Level 2", typeDescription: "Type 1" } 
] 

は私が次の結果を持つようにしたい3つの配列

var users = [ 
    { name: "A", type: 2, level: 1 }, 
    { name: "B", type: 1, level: 2 } 
] 
var types = [ 
    { description: "Type 1", id: 1 }, 
    { description: "Type 2", id: 2 } 
] 
var levels = [ 
    { description: "Level 1", id: 1 }, 
    { description: "Level 2", id: 1 } 
] 

を持っていると仮定しますObservablesがネストされていないソリューション。
ありがとうございます。

答えて

0

なぜこの問題でRxを使用しているのかわかりません。スペース(つまり配列)にデータがあり、時間の経過によるデータ(つまり、観測可能なシーケンス)ではありません。しかし、これらのアレイをRxに強制して、非常に複雑なソリューションを作成します。

私はあなたがここでの答えのようなものを探していると思いますhttps://stackoverflow.com/a/17500836/393615ソース配列タイプに参加します。あなたのケースでは、3つのデータセットをすべて結合するために2回「内側結合」します。

0

フィルタリングされたストリームの結果と元のストリームの最新の値を組み合わせたswitchMap演算子を使用してこれをアーカイブし、投影関数を使用して結果を単一のオブジェクトにマージすることができます。これは、どちらの場合でも一般的な高階関数を使用できるように、あなたの例で一般化することができます。 fiddleを参照してください。

フルコード(ES2015、RxJS5):

const users = [ 
    { name: "A", type: 2, level: 1 }, 
    { name: "B", type: 1, level: 2 } 
]; 
const types = [ 
    { description: "Type 1", id: 1 }, 
    { description: "Type 2", id: 2 } 
]; 
const levels = [ 
    { description: "Level 1", id: 1 }, 
    { description: "Level 2", id: 2 } 
]; 

const users$ = Rx.Observable.from(users); 
const types$ = Rx.Observable.from(types); 
const levels$ = Rx.Observable.from(levels); 

function join(s$, sourceProperty, targetProperty, streamProperty) { 
    return function(initObj) { 
    const stream$ = s$.filter(x => x.id === initObj[sourceProperty]); 
    return Rx.Observable.combineLatest(
     Rx.Observable.of(initObj), 
     stream$, 
     (obj, streamObj) => { 
     const prop = streamObj[streamProperty]; 
     return Object.assign({}, obj, { [targetProperty]: prop }); 
     } 
    ); 
    }; 
} 

users$ 
    .switchMap(join(types$, 'type', 'typeDescription', 'description')) 
    .switchMap(join(levels$, 'level', 'levelDescription', 'description')) 
    .subscribe(x => console.log(x)); 
関連する問題