通过ID

时间:2018-09-25 21:47:27

标签: 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的数量,并且它们从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中使用库的答案。

1 个答案:

答案 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);