Javascript 按id从对象数组中获取属性的最大值
我有一个如下所示的对象数组:Javascript 按id从对象数组中获取属性的最大值,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一个如下所示的对象数组: 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的数量,
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 ];
我怀疑我的数组(4)
位完全不正确,答案可能涉及.reduce()
,但我从未真正掌握reduce的诀窍,因此非常感谢您的帮助
注:我更喜欢避免使用lodash或jQuery库的答案。用于收集每个键的最高值。使用以下命令转换为数组:
const输入=[
{id:3,值:2},
{id:0,值:3},
{id:2,值:8},
{id:1,值:5},
{id:0,值:2},
{id:1,值:6}
]
const result=Object.values(input.reduce((r,{id,value})=>{
r[id]=+r[id]>值?r[id]:值;
返回r;
}, {}));
控制台日志(结果)
这个想法很好,但是在进入Math.max
之前,您缺少.map(item=>item.value)
。另外,Math.max
接受多个参数而不是数组,因此使用扩展语法。使用array.from({length:4},(u,index)=>…)
Aha,感谢您的澄清和指向其他问题的链接。我肯定是被新的阵列/地图的怪异所吸引,以至于无法思考其他的问题!谢谢你教我怎么用这种方法!将在时间到期后立即接受“使用array.values()
”转换为数组-不,只需从[]
开始,因为累加器可能会创建一个带有孔的数组(例如并非所有ID都在那里),而Object.values()
不会。我再次感到困惑。在这个解决方案中,Array.values()
在哪里,我将如何像您所说的那样使用累加器?我注意到,如果我运行input.reduce
而不使用对象。它周围的值,答案将变成{0:3,1:6,2:8,id:3,value:2}
,这是预期的吗?