首页 > 解决方案 > 根据 2 个键的属性减少数组

问题描述

我有一个这样的数组。

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
}))

请指教。

标签: javascriptarraysobject

解决方案


您需要跟踪每个value的当前最高项目,因此您可以尝试缩减为一个对象,其键是s,值是该名称当前获胜的 s。然后,获取结果对象的值: namenamevalue

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 ...方法只有在你最终只试图从中取出一个项目时才有效——因为你需要更多,你需要一个可以包含多个项目的对象。)


推荐阅读