javascript - 给定一个对象数组,将它们分组,只留下每个对象的一个记录,给定一个应该包含最小值的属性
问题描述
给定以下数组
[
{
balance: 105,
address: 'dd',
datetime: 2020-08-23T22:00:00.000Z
},
{
balance: 111,
address: 'aa',
datetime: 2020-08-23T22:00:00.000Z
},
{
balance: 115,
address: 'dd',
datetime: 2020-08-23T22:00:00.000Z
},
{
balance: 123,
address: 'aa',
datetime: 2020-08-23T22:00:00.000Z
},
{
balance: 153,
address: 'dd',
datetime: 2020-08-23T22:00:00.000Z
}
]
我希望这个数组最终看起来像
[
{
balance: 105,
address: 'dd',
datetime: 2020-08-23T22:00:00.000Z
},
{
balance: 111,
address: 'aa',
datetime: 2020-08-23T22:00:00.000Z
}
]
我已经根据其地址获取了重复的对象,只留下了余额值最低的对象。
解决方案
使用Array#reduce来累积所需的对象。为此,如果在累积的结果对象中存在具有地址值的属性作为键,则查找每个对象。如果不创建一个,则将对象添加为值。否则查看当前对象的余额是否更小,如果是,则更新对象。
最后使用Object.values获取所需数组的值。
function convert(array) {
return Object.values(array.reduce((acc, cur) => {
if (!acc[cur.address]) {
acc[cur.address] = cur;
} else {
if (cur.balance < acc.balance) {
acc[cur.address] = cur;
}
}
return acc;
}, {}));
}
let array = [
{
balance: 105,
address: 'dd',
datetime: '2020-08-23T22:00:00.000Z'
},
{
balance: 111,
address: 'aa',
datetime: '2020-08-23T22:00:00.000Z'
},
{
balance: 115,
address: 'dd',
datetime: '2020-08-23T22:00:00.000Z'
},
{
balance: 123,
address: 'aa',
datetime: '2020-08-23T22:00:00.000Z'
},
{
balance: 153,
address: 'dd',
datetime: '2020-08-23T22:00:00.000Z'
}
];
console.log(convert(array));
推荐阅读
- elasticsearch - 如何在elasticsearch中以排序方式查找条目数
- docker - 试图覆盖 ENTRYPOINT 的参数
- javascript - 使用 JavaScript 通过 Min.Io 上传的文件已损坏
- javascript - 如何过滤对象数组中的记录
- reactjs - Redux Saga 测试计划 - 为提供的调用存根不同的响应
- visual-studio-2008 - 什么是 Visual Studio 2008 接受的用于调试经典 ASP 的 web.config 文件?
- python - 使用 keras 构建变分自动编码器 - 错误:您必须使用 dtype float 和 shape 为占位符张量“encoder_input”提供一个值
- javascript - 如何在反应打字稿中循环遍历数组?
- r - Brms 荟萃分析 - 如何包括零标准误差?
- sql - 从 SQL Server 中的多个表中进行选择