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