Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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_Sorting - Fatal编程技术网

Javascript 如何对嵌套对象映射进行排序,并根据排序结果有效地赋值?

Javascript 如何对嵌套对象映射进行排序,并根据排序结果有效地赋值?,javascript,sorting,Javascript,Sorting,我有一个物体像: { "playerId1": { "score": 100, "rank": 0 }, "playerId2": { "score": 500, "rank": 0 }, "playerId3": { "score": 200, "rank": 0 } } 我需要根据分数对它们进行排序,然后将排序的顺序分配给排名。 最好的方法是什么 我已经厌倦了转换为数组,因此排序很容易,但我希望保留对象结构。您可以设置

我有一个物体像:

{
  "playerId1": {
    "score": 100,
    "rank": 0
  },
  "playerId2": {
    "score": 500,
    "rank": 0
  },
  "playerId3": {
    "score": 200,
    "rank": 0
  }
}
我需要根据分数对它们进行排序,然后将排序的顺序分配给排名。 最好的方法是什么


我已经厌倦了转换为数组,因此排序很容易,但我希望保留对象结构。

您可以设置秩并将其保留为对象

var-temp={
“玩家1”:{
“分数”:100分,
“排名”:0
},
“玩家2”:{
“分数”:500分,
“排名”:0
},
“玩家3”:{
“分数”:200分,
“排名”:0
}
};
对象值(临时)排序(函数(a,b){
返回a.score-b.score;
}).forEach(功能(玩家、等级){
player.rank=等级;
});

控制台日志(temp)您可以设置等级并将其作为对象保留

var-temp={
“玩家1”:{
“分数”:100分,
“排名”:0
},
“玩家2”:{
“分数”:500分,
“排名”:0
},
“玩家3”:{
“分数”:200分,
“排名”:0
}
};
对象值(临时)排序(函数(a,b){
返回a.score-b.score;
}).forEach(功能(玩家、等级){
player.rank=等级;
});

控制台日志(temp)无法对对象进行排序。但是您可以通过多种不同的方式将对象保持为一个排序数组。例如,如果您只需要按排名排序的玩家列表,您可以:

let obj={“playerId1”:{“分数”:100,“等级”:0},“playerId2”:{“分数”:500,“等级”:3},“playerId3”:{“分数”:200,“等级”:2}
让sortedPlayers=Object.keys(obj).sort((a,b)=>obj[a].rank-obj[b].rank)

console.log(sortedPlayers)
您无法对对象进行排序。但是您可以通过多种不同的方式将对象保持为一个排序数组。例如,如果您只需要按排名排序的玩家列表,您可以:

let obj={“playerId1”:{“分数”:100,“等级”:0},“playerId2”:{“分数”:500,“等级”:3},“playerId3”:{“分数”:200,“等级”:2}
让sortedPlayers=Object.keys(obj).sort((a,b)=>obj[a].rank-obj[b].rank)

log(sortedPlayers)
使用一些排序、映射和归约,您可以解构并重建对象

const obj={
“玩家1”:{
“分数”:100分,
“排名”:0
},
“玩家2”:{
“分数”:500分,
“排名”:0
},
“玩家3”:{
“分数”:200分,
“排名”:0
}
}
设r=Object.keys(obj)
.reduce((结果、键)=>{
设v=obj[key]
v['p']=键
返回结果concat(v)
}, [])
.sort((a,b)=>b.score-a.score)
.map((itm,idx)=>{itm.rank=idx+1;返回itm})
.reduce((result,itm)=>{result[itm['p']]]=itm;delete result[itm['p']]]['p'];return result},{})

log(r)
使用一些排序、映射和归约,您可以解构并重建对象

const obj={
“玩家1”:{
“分数”:100分,
“排名”:0
},
“玩家2”:{
“分数”:500分,
“排名”:0
},
“玩家3”:{
“分数”:200分,
“排名”:0
}
}
设r=Object.keys(obj)
.reduce((结果、键)=>{
设v=obj[key]
v['p']=键
返回结果concat(v)
}, [])
.sort((a,b)=>b.score-a.score)
.map((itm,idx)=>{itm.rank=idx+1;返回itm})
.reduce((result,itm)=>{result[itm['p']]]=itm;delete result[itm['p']]]['p'];return result},{})

console.log(r)
对象无法保证其密钥的顺序。如果你想让元素有一个顺序,可以使用一个数组。不过,关于设置秩的任何内容都没有说明你必须“保留”数组。你可以利用数组来设置秩并在事后丢弃它。这不是对象属性的工作方式。如果要保留对象,请创建一个数组,对对象属性名称进行排序和收集,以供以后使用。对象无法保证其键的顺序。如果你想让元素有一个顺序,可以使用一个数组。不过,关于设置秩的任何内容都没有说明你必须“保留”数组。你可以利用数组来设置秩并在事后丢弃它。这不是对象属性的工作方式。如果要保留对象,请创建一个数组,对对象属性名称进行排序和收集,以备将来使用。