javascript - 通过 id 从对象数组中获取属性的最大值
问题描述
我有一个看起来像这样的对象数组:
const input = [
{id: 3, value: 2},
{id: 0, value: 3},
{id: 2, value: 8},
{id: 1, value: 5},
{id: 0, value: 2},
{id: 1, value: 6}
]
我正在尝试通过 id 构建一个最大值的数组,以 id 作为索引。对于我们的示例,所需的输出如下:
const output = [ 3, 6, 8, 2 ]
我还假设我提前知道唯一 ID 的数量,并且它们从 0 开始并依次上升。我对此的第一个打击是.map()
在正确长度的空数组上,并.filter()
为每个 id 构建中间数组,然后Math.max()
在过滤后的数组上使用。
const myAttempt = Array(4).map((_, index) => {
const filtered = input.filter(item => item.id === index);
return Math.max(filtered);
});
我从中得到的只是:
myAttempt = [ 4 empty slots ];
我怀疑我对这点完全不了解Array(4)
,答案可能涉及.reduce()
,但我从来没有真正掌握 reduce 的窍门,所以非常感谢任何帮助。
PS:我更喜欢避免在 lodash 或 jQuery 中使用库的答案。
解决方案
用于Array.reduce()
收集每个键的值最大值。使用以下方法转换为数组Array.values()
:
const input = [
{id: 3, value: 2},
{id: 0, value: 3},
{id: 2, value: 8},
{id: 1, value: 5},
{id: 0, value: 2},
{id: 1, value: 6}
]
const result = Object.values(input.reduce((r, { id, value }) => {
r[id] = +r[id] > value ? r[id] : value;
return r;
}, {}));
console.log(result);
如果从 0 开始的所有 id 都出现在数组中,您可以通过它们的id
(index) 将值添加到数组累加器中:
const input = [
{id: 3, value: 2},
{id: 0, value: 3},
{id: 2, value: 8},
{id: 1, value: 5},
{id: 0, value: 2},
{id: 1, value: 6}
]
const result = input.reduce((r, { id, value }) => {
r[id] = +r[id] > value ? r[id] : value;
return r;
}, []);
console.log(result);
推荐阅读
- startup - 启动时未调用 Micronoaut ServerStartupEvent 回调?
- google-app-engine - Appengine 上的 Nodejs,google-cloud/storage:如何检查文件夹是否存在,如果存在,则从中获取所有文件?
- java - ANTLR 简单公式解析器
- r - R 中的 Weibull boot.pdf 错误:L-BFGS-B 所需的有限值
- r - 使用 R 找到最大化对数似然的 λ
- asp.net-core - 流利的 NHibernate 与 ASP.NET 核心
- android - setRequestedOrientation 后自动旋转不起作用
- php - mysql查询从出生到3个月大的人数
- javascript - 如何将动态字段添加到 Wordpress 联系表 7?
- javascript - 如何使用 JQuery 存储从 URL 获取的 JSON 值?