javascript - 如何使用下划线对这个哈希数组进行排序和过滤
问题描述
我想使用以下哈希数组中的underscore.js
每一个来获取最高价格。tokenId
我想这需要两次遍历数组,但也许有更有效的方法。使用下划线仅获取一个哈希键tokenId
并选择价格最高且迭代次数最少的整个数组集的最佳方法是什么?
const data = [
{
"tokenId": 1,
"price": 1.8
},
{
"tokenId": 1,
"price": 2.0
},
{
"tokenId": 1,
"price": 1.9
},
{
"tokenId": 2,
"price": 5.0
},
{
"tokenId": 2,
"price": 1.0
},
{
"tokenId": 3,
"price": 1.9
}
]
// final result should be
// sortedFiltered = [{tokenId: 1, price: 2.0}, {tokenId: 2, price: 5.0}, {tokenId: 3, price: 1.9}]
解决方案
reduce 可以在一次迭代中完成。使用累加器保持由 tokenId 索引的最大价格值。
const data = [
{
"tokenId": 1,
"price": 1.8
},
{
"tokenId": 1,
"price": 2.0
},
{
"tokenId": 1,
"price": 1.9
},
{
"tokenId": 2,
"price": 5.0
},
{
"tokenId": 2,
"price": 1.0
},
{
"tokenId": 3,
"price": 1.9
}
]
// one iteration, with a custom function
const maxes = data.reduce((acc, o) => {
if (acc[o.tokenId] === undefined) acc[o.tokenId] = 0;
if (acc[o.tokenId] < o.price) acc[o.tokenId] = o.price;
return acc;
}, {});
console.log(maxes);
推荐阅读
- javascript - 检测是否支持 beforeinput
- android - Flutter Firebase Batch Update Unhandled Exception: Bad state: 此批次已提交,无法再更改
- express - 对身份验证技术的怀疑 - 护照
- javascript - 将图像从反应发送到烧瓶并返回 ocr 值以进行反应
- javascript - 问题将文件作为列表发送到 WebApi 中的方法
- python - 来自文件的 Python 动画
- laravel - 如何在 Laravel API 中通过文件上传使用 PUT 方法
- terraform - 如何在 Terraform Cloud 中输入复杂(嵌套)变量?
- python - 如何使用用于在 Python 中悬停按钮的图像更改按钮的图像?
- r - 如何在 R 中的同一图中绘制多组特征向量?