Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于给定标准对对象键进行排序_Javascript_Node.js - Fatal编程技术网

Javascript 基于给定标准对对象键进行排序

Javascript 基于给定标准对对象键进行排序,javascript,node.js,Javascript,Node.js,我的目标如下: let res = { 'name': { age: 10, density: 33, length: 2 }, 'greet': { age: 33, density: 92, length: 3 }, 'gyrt': { age: 91, density: 2, length: 47 }, .

我的目标如下:

let res = {
   'name': {
      age: 10,
      density: 33,
      length: 2
    },
    'greet': {
       age: 33,
       density: 92,
       length: 3
    },
    'gyrt': {
        age: 91,
        density: 2,
        length: 47
     },
     .
     .
     .
}
它有更多的键值对。我被要求按“排名”的降序返回键列表,该列表受以下约束条件约束:

  • 年龄越大,排名越高
  • 密度低的单词必须排得更高
  • 长度较长的单词必须排得更高
我对如何实现这一目标感到困惑。我正在尝试对对象进行排序,但这并没有帮助。我首先尝试使用
年龄
,然后使用
密度
,然后使用
长度
进行排序,但显然不起作用,因为对象被一次又一次地重新排序,而忘记了前一个顺序。我怎样才能做到这一点

这就是我所尝试的:

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));

长度
相同。我无法理解如何组合所有因素并对其排序。

您只需在排序函数中输入一些条件,检查年龄或密度是否相等,如果相等,则按下一组规则(年龄->密度->长度)排序:

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:47}
设sorted=Object.values(a);
排序。排序((a,b)=>{
如果(a.age==b.age){
如果(a.密度===b.密度){
//按长度排序
返回b.length-a.length;
}
//按密度排序
返回a.密度-b.密度;
}
//按年龄分类
返回b.age-a.age;
});
console.log(sorted)
使用我介绍的
sortBy()
函数,您可以创建一个排序方法,将每个属性组合在一起,如下所示:

const res={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}
常数sortBy=fn=>(a,b)=>-(fn(a)fn(b))
常量pick=key=>({[key]:value})=>value
const age=sortBy(pick('age'))
const density=sortBy(pick('density'))
const length=sortBy(pick('length'))
常数sortFn=(a,b)=>
-年龄(a[1],b[1])||
密度(a[1],b[1])||
-长度(a[1],b[1])
常量keys=Object.entries(res).sort(sortFn).map([key,value])=>key)

console.log(keys)
你能分享一下解决这个问题的方法吗?提示:你不能对对象进行排序,但你可以对数组进行排序,试试`const sorted=object.entries(a).sort(…)@LucaKiebel我在问题中粘贴了我试图排序的片段。通用解决方案也存在类似的问题。通用解决方案也存在类似的问题。年龄越大的单词必须排得越高。密度较低的单词必须排在较高的位置。目前它打印年龄,顶部为10。请立即检查它。我刚意识到这一点,在写答案时,我总共更改了100万次。^^此外,我如何才能只获得
?我在这里尝试的是另一种情况,高排名会更高,高发生率将排名更高,低长度将排名更高。但是我在模仿你的方法时犯了一些错误。你能帮我做这个吗?