我无法使用Lodash轻松解决一件我可以做的事情。
我需要groupBy
和sum
这样的东西,只使用RxJs:
let arr = [
{n: 'a', q: 1 },
{n: 'a', q: 2},
{n: 'b', q: 4 }
];
let v = _(arr).chain().groupBy('n').map(sumQt).value()
function sumQt(x) {
return { name: x[0].n, qt: _.sum(x, 'q') }
}
// it produces array like: [{ name: "a", qt: 3 }, { name: "b", qt: 4 }]
答案 0 :(得分:4)
我现在无法想办法用rx优雅地解决它 - 使用rx + lodash ok?
// setup
let arr = [{n: 'a', q: 1 },
{n: 'a', q: 2},
{n: 'b', q: 3 }];
function sumQt(x) {
return { name: x[0].n, qt: _.sum(x, 'q') }
}
使用lodash
let v = _(arr)
.chain()
.groupBy('n')
.map(sumQt)
.value()
console.log('lodash:', v)
仅使用rx
Rx.Observable.from(arr)
.groupBy(x => x.n)
.flatMap(group => {
return group.reduce((acc, currentValue) => {
acc.n = currentValue.n;
acc.qt = acc.qt + currentValue.q;
return acc;
}, {n: undefined, qt: 0})
})
.subscribe(sum => console.log('rx:', sum));
如果您使用q
代替qt
Rx.Observable.from(arr)
.groupBy(x => x.n)
.flatMap(group => {
return group.reduce((acc, currentValue) => {
acc.q = acc.q + currentValue.q;
return acc;
})
})
.subscribe(sum => console.log('rx:', sum));
使用rx& lodash
Rx.Observable.from(arr)
.groupBy(x => x.n)
.flatMap(group => group.toArray())
.map(sumQt)
.subscribe(sum => console.log('rx+lodash:', sum));
答案 1 :(得分:1)
以下代码似乎适用于您的问题。
toArray
函数将在释放数组之前等待源完成。 flatMap
的使用。 groupBy
发出流(每个组一个流),使用toArray
允许您在一个数组中聚合每个流(组)的内容。 toArray
运算符返回一个observable,其唯一值是统一数组。如果您使用map
运算符而不是flatMap
,则会发出一个observable而不是该observable发出的值。代码在这里:
var arr = [{n : 'a', q : 1},
{n : 'a', q : 4},
{n : 'b', q : 4}];
var key_group_by = 'n';
var key_sum_by = 'q';
var groupedArr$ = Rx.Observable.from(arr)
.groupBy(function ( x ) {
return x[key_group_by];
})
.flatMap(function ( groupedKeys$ ) {
// groupKeys$ is an observable
return groupedKeys$
.toArray()
.map(sum_by(key_sum_by));
});
function sum_by ( key ) {
return function sum_by_key ( aHashMap ) {
var result = {};
// Here you could also use your underscore library
var acc = 0;
aHashMap.forEach(function ( value ) {acc += value[key];});
aHashMap[0][key] = acc;
return aHashMap[0];
};
}
groupedArr$.subscribe(emits("groups:"));
function emits ( who ) {
return function ( x ) { console.log([who, "emits"].join(" "), x);};
}
jsbin在这里:http://jsbin.com/huqafajudi/edit?html,js,console
控制台输出:
"groups: emits"
[object Object] {
n: "a",
q: 5
}
"groups: emits"
[object Object] {
n: "b",
q: 4
}