首页 > 解决方案 > 通过 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 中使用库的答案。

标签: javascriptarraysecmascript-6

解决方案


用于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);


推荐阅读