我有一个像这样的数组。

var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}]


我需要一个像这样的数组:

var newData = [{
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}]


这是数组中每个“名称”键的最大值。

这是我尝试过的:



var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}]

console.log(data.reduce(function(prev, current) {
  return (prev.name !== current.name && prev.value > current.value) ? prev : current
}))





请指教。

最佳答案

您需要跟踪每个value当前最高的name项目,因此您可以尝试简化为一个对象,该对象的键是name,值是该名称当前赢得的value 。然后,获取结果对象的值:



var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}];

console.log(Object.values(
  data.reduce((a, item) => {
    const { name, value } = item;
    if (!a[name] || a[name].value < value) a[name] = item;
    return a;
  }, {})
));





(您的prev.name !== current.name ...方法仅在您最终尝试从中取出一项时才有效-因为您需要更多,所以需要一个可以包含多个项目的对象。)

关于javascript - 根据2个键的属性精简数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53292876/

10-10 14:05
查看更多