2016-09-06 9 views
0

こんにちは私はサーバから来た2つの配列を持っており、最初の配列に基づいて2の配列に値を割り当てる必要があります。 最初の配列の例私は人のnameIdを持っています、このIDに基づいて私は実名を見つけてそれを割り当てる必要があります。それが正しい反応を起こすかどうかわからない。別のオブザーバブルに基づいてオブジェクトにプロパティを追加します。

var names = this.nameService.query() 
     .flatMap((names) => { 
      return Observable.from(names); 
     }).flatMap(name => { 
      return Observable.combineLatest(Observable.of(name), this.nameArray, (name,nameArray) => { 
       name.realName = this.nameService.getRealNamedName(name.nameId, names); 
       return name; 
      }) 
     }).toArray(); 


names.subscribe(names => { 
this.names = names 
}) 

EDITED:

命令型プログラミングと私はこの

var promises = { 
      people: peopleService.getPeople(), 
      names: nameService.getNames() 
     }; 

    $q.all(promises).then(result => { 
     this.people = result.people.forEach(person => { 
          person.realName = result.names.find((name) => { 
           return name.id === person.id 
          })['realName'] 
         }) 
    }) 

答えて

0

はアップデートのようにそれを記述します。あなたがObservable.combineLatest使用することができます

const realNames = [ 
    {'id': 2, 'realName': 'jane'}, 
    {'id': 1, 'realName': 'john'}, 
    {'id': 3, 'realName': 'joe'} 
]; 

const peopleObservable = Rx.Observable.from([ 
    {id: 3, foo: 'foo3', bar: 'bar3'}, 
    {id: 1, foo: 'foo1', bar: 'bar1'}, 
    {id: 2, foo: 'foo2', bar: 'bar2'} 
]); 

const justNamesObservable = Rx.Observable.just(realNames); 
const peopleWithNameObservable = Rx.Observable.combineLatest(peopleObservable, justNamesObservable); 

var subscription = peopleWithNameObservable.subscribe(
    x => { 
    const person = x[0]; 
    const names = x[1]; 
    const personWithRealName = names.find((name) => { 
     return name.id === person.id 
    });   
    person.realName = personWithRealName.realName   
    console.log(person); 
    }, 
    e => { 
    console.log(e); 
    }, 
() => { 
    console.log('complete'); 
    } 
); 

。このトリックは、信号が放出されるたびに、人の人物と、という名前の配列のすべてが含まれています。ここでfind()を実行できます。

http://jsbin.com/yurufi/edit?js,console


前の答え:

私は要件にそれほど明確ではないんだけど、あなたの質問に基づいて、あなたは(この回答の時点で)掲載、私は2を想定しています配列は同じ順序で放出され、1対1、その後、あなたは次のようにObservable.zip使用することができますがありますされています

const getRealNamedName = id => { 
    const realNames = { 
    '1': 'john', 
    '2': 'jane', 
    '3': 'joe', 
    }; 
    return realNames[id]; 
} 

const firstArray = Rx.Observable.from([1, 2, 3]); 
const secondArray = Rx.Observable.from([ 
    {id: 1, foo: 'foo1', bar: 'bar1'}, 
    {id: 2, foo: 'foo2', bar: 'bar2'}, 
    {id: 3, foo: 'foo3', bar: 'bar3'} 
]); 

const zipped = Rx.Observable.zip(firstArray, secondArray, (id, second) => 
    Object.assign({'realName': getRealNamedName(id)}, second) 
); 

zipped.subscribe(name => 
    { 
    console.log(name); 
    }, 
    e => { 
    //handle error 
    }, 
() => { 
    //handle complete 
    } 
); 

http://jsbin.com/jiqofihoko/edit?js,console

+0

ありがとうございます。私が探していたものではありませんが、より明確にするために質問を更新します。 – alexKhymenko

+0

@alexKhymenko私は答えを更新しました –

+0

ありがとう非常に – alexKhymenko

関連する問題