【问题标题】:JavaScript: Get average object in array?JavaScript:获取数组中的平均对象?
【发布时间】:2018-05-11 08:38:21
【问题描述】:

我正在想办法让这段代码变得简单,使用最少的循环和变量,但我遇到了麻烦。

我想根据“值”获取数组“数字”中的平均对象。我觉得必须有一种数学方法来获得平均值,而无需在另一个循环中找到最接近的平均值。

目前我有这个烂摊子:

var numbers = [
	{ value: 41 },
	{ value: 19 },
	{ value: 51 },
	{ value: 31 },
	{ value: 11 }
];
// Find average:
var sum = 0;
for (var i = 0; i < numbers.length; i++) {
	sum += numbers[i].value;
}
var average = sum / numbers.length;
// Find closest object to average:
var match, difference;
for (var j = 0; j < numbers.length; j++) {
	const diff = Math.abs(average - numbers[j].value);
	if (difference === undefined || diff < difference) {
		difference = diff;
		match = numbers[j];
	}
}
// Print junk:
console.log("AVERAGE NUMBER: " + average);
console.log("CLOSEST OBJECT: " + match);
console.log("CLOSEST NUMBER: " + match.value);

我需要检索该对象,因为它包含我需要使用的其他信息。

任何帮助将不胜感激!

【问题讨论】:

  • 我投票结束这个问题,因为“不那么可怕”是非常主观的。关于工作代码的问题通常更适合codereview.stackexchange.com
  • @Quentin 对不起,我会尝试重写
  • 我很难说出这个问题,所以写了上面的代码来帮助解释这个问题,但它似乎是解决方案

标签: javascript arrays average


【解决方案1】:

至少您需要两个循环来获取平均值和最接近的项目,因为您需要在第一次运行中访问所有项目并且您没有可能提前存储哪个项目具有最接近的值。

您可以先获取平均值,然后再减少与对象最接近的值。

var numbers = [{ value: 41 }, { value: 19 }, { value: 51 }, { value: 31 }, { value: 11 }, { value: 30 }],
    average = numbers.reduce((sum, { value }) => sum + value, 0) / numbers.length,
    closest = numbers.reduce((a, b) =>
        Math.abs(average - a.value) <= Math.abs(average - b.value)
            ? a
            : b
    );

console.log(average);
console.log(closest);

【讨论】:

  • 如果我将 30 添加到组合中,则平均值为 30.5,最接近的为 30。不应该是 31 吗?
  • @mplungjan 在这种情况下,你更喜欢哪个结果?
  • @NinaScholz 谢谢你!我只是想知道,您是否认为在数学上可以找到平均对象而不先找到平均值,然后找到最接近的平均值?我觉得我使用两个循环做错了什么。有没有更简单的方法?
  • 我希望 31 获得 30.5+
  • @MysteryPancake 你在考虑中位数吗?不求平均值就无法求平均值。你也找不到最接近你还不知道的东西。还是我误解了你的意思?
猜你喜欢
  • 2021-09-26
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2014-05-10
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多