javascript - 根据 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
}))
请指教。
解决方案
您需要跟踪每个value
的当前最高项目,因此您可以尝试缩减为一个对象,其键是s,值是该名称当前获胜的 s。然后,获取结果对象的值: 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 ...
方法只有在你最终只试图从中取出一个项目时才有效——因为你需要更多,你需要一个可以包含多个项目的对象。)
推荐阅读
- c# - unity Time.timeScale = 0 不会冻结整个场景
- drupal - 对 Drupal 的 Axios 身份验证请求 - invalid_grant
- java - 升级到版本后的 EasyImage 问题。3.0.1
- php - 循环 JSON 图像 - 关于高级自定义字段
- javascript - 如何在Vue中根据选择更改输入的占位符
- accounting - 精确在线 - 是否可以明确匹配 GeneralJournalEntry 和 BankEntry 单个条目行?
- azure - 使用 kubectl 执行 CURL
- javascript - 使用道具为div添加背景
- sql - USE dbName VS dbName.TableName 的区别?
- wordpress - 在 Google Cloud 和 Cloud SQL 之间设置 SSL