javascript - 根据给定标准对对象键进行排名
问题描述
我有以下对象:
let res = {
'name': {
age: 10,
density: 33,
length: 2
},
'greet': {
age: 33,
density: 92,
length: 3
},
'gyrt': {
age: 91,
density: 2,
length: 47
},
.
.
.
}
其中有更多的键值对。我被要求按“排名”的降序返回键列表,该列表受以下约束:
- 年龄越大必须排名越高
- 密度低的词必须排名较高
- 长度高的单词必须排名更高
我很困惑如何实现这一目标。我正在尝试对对象进行排序,但这无济于事。我首先尝试使用排序age
,然后使用排序,然后使用排序density
,length
但它显然不起作用,因为对象被一次又一次地重新排序,同时忘记了先前的顺序。我怎么能做到这一点?
这就是我正在尝试的:
let sortByAge = keys.sort((a, b) => Number(res[b].age) - Number(res[a].age));
let sortByDensity = keys.sort((a, b) => Number(res[b].density) - Number(res[a].density));
与length
. 我无法理解如何组合所有因素并对其进行排序。
解决方案
您只需在排序函数中添加一些条件,检查年龄或密度是否相等,如果相等,则按下一组规则(年龄 -> 密度 -> 长度)排序:
let a={'name':{age:10,density:33,length:2},'greet':{age:33,density:92,length:3},'gyrt':{age:91,density:2,length:47},'foo':{age:91,density:3,length:47},'bar':{age:91,density:2,length:30},'baz':{age:10,density:2,length:47},'boo':{age:91,density:2,length:47},}
let sorted = Object.values(a);
sorted.sort((a,b) => {
if(a.age === b.age) {
if(a.density === b.density) {
//sort by length
return b.length - a.length;
}
//sort by density
return a.density - b.density;
}
//sort by age
return b.age - a.age;
});
console.log(sorted)
要对键进行排序(排序值更好地显示其工作原理),只需将a
and替换b
为obj[a]
andobj[b]
let obj={'name':{age:10,density:33,length:2},'greet':{age:33,density:92,length:3},'gyrt':{age:91,density:2,length:47},'foo':{age:91,density:3,length:47},'bar':{age:91,density:2,length:30},'baz':{age:10,density:2,length:47},'boo':{age:91,density:2,length:47},}
let sorted = Object.keys(obj);
sorted.sort((a,b) => {
if(obj[a].age === obj[b].age) {
if(obj[a].density === obj[b].density) {
//sort by length
return obj[b].length - obj[a].length;
}
//sort by density
return obj[a].density - obj[b].density;
}
//sort by age
return obj[b].age - obj[a].age;
});
console.log(sorted)
推荐阅读
- asp.net - 使用 AngularJS 将数据从视图传递到 net-mvc 控制器
- javascript - Angular:ngOnInit 不加载我的函数?
- networking - 物理通信的通用“管道”概念的名称?
- php - Laravel 5.6 通知“没有发件人地址无法发送消息”
- python-3.x - 检查列表中的所有点都在矩形内
- c# - Bot 无法通过 WCF(连接服务)插入 SQL 数据库?
- javascript - 使用 python 中的请求从网站获取 cookie
- database - 使用 Vue 和 API 端点处理多个寄存器
- java - 列表无法转换为列表
- filter - GraphQL - 动态地将字段添加到结果中