基于另一个observable向对象添加属性

时间:2016-09-06 11:55:45

标签: javascript arrays rxjs

我有两个来自服务器的数组,我需要根据第一个数组为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 
})

已编辑:

使用命令式编程我会像这样写

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']
                         })
    })

1 个答案:

答案 0 :(得分:0)

更新

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');
  }
);

您可以使用Observable.combineLatest。技巧是每次发出信号时,它包含一个 person 对象和整个名称数组,您可以在其中执行find()。

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

上一个回答:

我对要求不是很清楚,但根据你发布的问题(在这个回答的时候),我假设2个阵列以相同的顺序发出,并且那里有1个-to-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