【问题标题】:nodejs: calculate mean with highland streamsnodejs:计算高地流的平均值
【发布时间】:2017-02-13 18:32:43
【问题描述】:

我刚刚开始使用 highland.js 和 node 中的流,我一直在尝试计算某些数字的最小/最大/平均值。 这是我目前所拥有的:

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;
  }, {});

如果我这样做,比如说,toCallbackconsole.log 我得到的结果 {min: 1, max: 3, count: 3, sum: 6} 但我对 count 和 sum 字段不感兴趣,我想要像 {min: 1, max: 3, mean: 2} 这样的对象。

但是,由于reduce的返回是一个对象,所以什么都没有 高地可以用它 - 我只能消耗它,但我想在高地做平均。

我该如何从这里继续,或者我应该如何重构代码以获得平均水平?

【问题讨论】:

  • 不确定您使用的是哪个高地版本,但您发布的代码会引发类似“函数 f 未定义”的错误。我交换了 .reduce 参数(先传递 {},然后是函数),它开始工作了。
  • 我正在使用3.0.0-beta.3,实际上,它从 2.x 分支中反转了 reduce 的参数。

标签: node.js stream highland.js


【解决方案1】:

您可以尝试像这样使用 highland .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);
	});

【讨论】:

  • 谢谢,这个答案有效,我将批准它。首先让我感到困惑的是reduce返回了一个对象,而我试图用flatMap而不是map来跟踪它,然后引发错误。
  • 附带说明一下,我最终使用了一个不需要计数的“运行均值”公式:mean = (mean * (n - 1) + val) / n 其中n 是迭代次数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2017-02-06
  • 2015-04-23
  • 2012-06-19
相关资源
最近更新 更多