javascript - javascript对象数组添加排名但不更改主数组的顺序
问题描述
我想rank
根据totalpremium
值在每个元素上添加一个键(但我不想更改数组内对象的顺序),我当前的代码工作正常,但它改变了我没有的对象的主数组的顺序想做。
对象数组:
[
{
totalcount: 2834682,
totalpremium: 652553820
},
{
totalcount: 1380674,
totalpremium: 430713235
},
{
totalcount: 862119,
totalpremium: 165983898
}
]
工作功能
// add rank to each object
function rank_by_key(array, key_name) {
if (key_name) {
array.sort(function (a, b) {
return b[key_name] - a[key_name];
});
var rank = 1;
for (var i = 0; i < array.length; i++) {
if (i > 0 && array[i][key_name] < array[i - 1][key_name]) {
rank++;
}
array[i].rank = rank;
}
}
return array;
}
ranked_result = rank_by_key(array, 'totalpremium');
预期输出:
[
{
"totalcount": 2834682,
"totalpremium": 110,
"rank": 2
},
{
"totalcount": 1380674,
"totalpremium": 121,
"rank":1
},
{
"totalcount": 862119,
"totalpremium": 100,
"rank": 3
}
]
电流输出:
[
{
"totalcount": 1380674,
"totalpremium": 121,
"rank":1
},
{
"totalcount": 2834682,
"totalpremium": 110,
"rank": 2
},
{
"totalcount": 862119,
"totalpremium": 100,
"rank": 3
}
]
解决方案
这将创建一个排名数组,然后我们可以在创建新属性时引用它
let data = [
{
totalcount: 2834682,
totalpremium: 652553820
},
{
totalcount: 1380674,
totalpremium: 43071324534435
},
{
totalcount: 862119,
totalpremium: 165983898
}
]
let ranks = data.map(e => e.totalpremium).sort((a,b) => b-a)
let ranked = data.map( e=> ({...e, rank: (ranks.indexOf(e.totalpremium)+1)}));
console.log(ranked)
推荐阅读
- amazon-ec2 - 如何在AWS中获取OU中Member用户创建的EC2实例列表
- javascript - 如何使用ajax和jquery从带有id的xm文件中获取数据
- linux - GCE:Ubuntu 18.04 自定义映像没有连接/SSH?
- django - 加载静态文件时出现问题|| django
- java - 检查两个 JSON 是否匹配并生成不同的报告
- ruby-on-rails - Rails、Heroku、Cloudinary:虽然在本地工作,但照片在生产中没有上传到 cloudinary
- azure - 远程禁用我的 Azure 虚拟机上的网络级别安全性
- javascript - 如何创建动态数据集和新的动态多 yAxes
- api - 开发企业级和可扩展的现代 API Web 服务的方法
- java - 使用 rxJava 调用 API