我有一个看起来像这样的对象数组:
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()
在正确长度的空数组上,并为每个id用.filter()
构建中间数组,然后在过滤后的数组上使用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中使用库的答案。
答案 0 :(得分:1)
使用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
(索引)添加到数组累加器中:
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);