各オブジェクトにプロパティを追加して、非同期的に変更する必要がある一連のオブジェクトがあります。
[{ id: 1 }, { id: 2 }] => [{ id: 1, foo: 'bar' }, { id: 2, foo: 'bar' }]
これに相当する同期は次のようになります。
var xs = [{ id: 1 }, { id: 2 }];
// Warning: mutation!
xs.forEach(function (x) {
x.foo = 'bar';
});
var newXs = xs;
ただし、私の場合、foo
プロパティを非同期的に追加する必要があります。foo
プロパティが追加されたオブジェクトのシーケンスを終了値にしたいと思います。
この問題を解決するために、次のコードを思いつきました。この例では、各オブジェクトに の値を持つプロパティを追加していますbar
。
var xs = Rx.Observable.fromArray([{ id: 1 }, { id: 2 }]);
var propertyValues = xs
// Warning: mutation!
.flatMap(function (x) {
return Rx.Observable.return('bar');
});
var newXs =
.zip(propertyValues, function (x, propertyValue) {
// Append the property here
x.foo = propertyValue;
return x;
})
.toArray();
newXs.subscribe(function (y) { console.log(y); });
これは私の問題を解決する最良の方法ですか、それとも Rx はシーケンス内のオブジェクトを非同期的に変更するためのより良い手段を提供しますか? 変更する必要がある深いツリーがあり、このコードはすぐに扱いにくくなるため、よりクリーンなソリューションを探しています。
var xs = Rx.Observable.fromArray([{ id: 1, blocks: [ {} ] }, { id: 2, blocks: [ {} ] } ]);
var propertyValues = xs
// Warning: mutation!
.flatMap(function (x) {
return Rx.Observable.fromArray(x.blocks)
.flatMap(function (block) {
var blockS = Rx.Observable.return(block);
var propertyValues = blockS.flatMap(function (block) {
return Rx.Observable.return('bar');
});
return blockS.zip(propertyValues, function (block, propertyValue) {
block.foo = propertyValue;
return block;
});
})
.toArray();
});
xs
.zip(propertyValues, function (x, propertyValue) {
// Rewrite the property here
x.blocks = propertyValue;
return x;
})
.toArray()
.subscribe(function (newXs) { console.log(newXs); });
そもそも、この突然変異を行うべきではないのでしょうか?