nodejs:用高地流计算平均值
nodejs: calculate mean with highland streams
我刚刚开始使用 highland.js 和节点中的流,我一直在尝试计算一些数字的 min/max/mean。
这是我目前所拥有的:
const _ = require('highland');
const input = [
{ val: 1 },
{ val: 2 },
{ val: 3 },
];
_(input)
.reduce((acc, { val }) => {
if (typeof acc.min === 'undefined' || val < acc.min) {
acc.min = val;
}
if (typeof acc.max === 'undefined' || val > acc.max) {
acc.max = val;
}
acc.count = (acc.count || 0) + 1;
acc.sum = (acc.sum || 0) + val;
return acc;
}, {});
如果我然后做,比方说,toCallback
和 console.log
我得到的结果
{min: 1, max: 3, count: 3, sum: 6}
但我对计数和求和字段不感兴趣,我想要像 {min: 1, max: 3, mean: 2}
.
这样的对象
但是,由于reduce的return是一个对象,所以什么都没有
高地可以用它 - 我只能消费它但我想在高地做平均。
我该如何从这里继续,或者我应该如何重构代码以获得该平均值?
您可以尝试使用这样的高地 .map 方法:
_(input)
.reduce({}, (acc, {val}) => {
if (typeof acc.min === 'undefined' || val < acc.min) {
acc.min = val;
}
if (typeof acc.max === 'undefined' || val > acc.max) {
acc.max = val;
}
acc.count = (acc.count || 0) + 1;
acc.sum = (acc.sum || 0) + val;
return acc;
})
.map(stats => {
return {
min: stats.min,
max: stats.max,
mean: stats.sum / stats.count
};
})
.toCallback(function (err, data) {
//Contains the data structure you need
console.log(data);
});
我刚刚开始使用 highland.js 和节点中的流,我一直在尝试计算一些数字的 min/max/mean。 这是我目前所拥有的:
const _ = require('highland');
const input = [
{ val: 1 },
{ val: 2 },
{ val: 3 },
];
_(input)
.reduce((acc, { val }) => {
if (typeof acc.min === 'undefined' || val < acc.min) {
acc.min = val;
}
if (typeof acc.max === 'undefined' || val > acc.max) {
acc.max = val;
}
acc.count = (acc.count || 0) + 1;
acc.sum = (acc.sum || 0) + val;
return acc;
}, {});
如果我然后做,比方说,toCallback
和 console.log
我得到的结果
{min: 1, max: 3, count: 3, sum: 6}
但我对计数和求和字段不感兴趣,我想要像 {min: 1, max: 3, mean: 2}
.
但是,由于reduce的return是一个对象,所以什么都没有 高地可以用它 - 我只能消费它但我想在高地做平均。
我该如何从这里继续,或者我应该如何重构代码以获得该平均值?
您可以尝试使用这样的高地 .map 方法:
_(input)
.reduce({}, (acc, {val}) => {
if (typeof acc.min === 'undefined' || val < acc.min) {
acc.min = val;
}
if (typeof acc.max === 'undefined' || val > acc.max) {
acc.max = val;
}
acc.count = (acc.count || 0) + 1;
acc.sum = (acc.sum || 0) + val;
return acc;
})
.map(stats => {
return {
min: stats.min,
max: stats.max,
mean: stats.sum / stats.count
};
})
.toCallback(function (err, data) {
//Contains the data structure you need
console.log(data);
});