javascript - 根据 2 个键的属性减少数组

标签 javascript arrays object

我有一个像这样的数组。

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

即获取数组中每个“name”键的最高值。

这是我尝试过的:

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,values 是该名称当前获胜的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 ... 方法仅在您仅尝试从其中获取一个项目时才有效end - 因为您需要更多,所以您需要一个可以包含多个项目的对象。)

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

相关文章:

javascript - 当他到达页面末尾时重置 JavaScript 上的移动按钮

php - Laravel,将数据从原始查询转换为 JSON

java - 如何比较字符串数组并计算相似单词

java - 初始化字符数组

PHP fatal error : Call to a member function . .. 在非对象上:区分大小写

javascript - 尝试使用 _.sortBy 方法对对象数组进行排序

javascript - 如何使用 jquery.live()

php - 从未知对象属性构建数组

ios - 如何使用NSLog显示对象数组

javascript - 如何从索引和键更新本地存储对象值