Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.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 在JS中按值对嵌套字典排序_Javascript_Dictionary - Fatal编程技术网

Javascript 在JS中按值对嵌套字典排序

Javascript 在JS中按值对嵌套字典排序,javascript,dictionary,Javascript,Dictionary,有人能帮我找出用JavaScript对一本字典和另一本字典进行排序的方法吗? 这就是我的dict的样子: {'POS2':{'stegano':0,'sum':200,'misc':100,'web':0,'ppc':0,'crypto':0,'admin':0,'vuln':0,'取证]:0,'hardware':0,'reverse':0,'recon':100} 我想按嵌套dict中存储的“sum”键对其进行排序。 我可以找到一些用python编写的解决方案,但这里的挑战是在JS中实现相同

有人能帮我找出用JavaScript对一本字典和另一本字典进行排序的方法吗? 这就是我的dict的样子:

{'POS2':{'stegano':0,'sum':200,'misc':100,'web':0,'ppc':0,'crypto':0,'admin':0,'vuln':0,'取证]:0,'hardware':0,'reverse':0,'recon':100}

我想按嵌套dict中存储的“sum”键对其进行排序。 我可以找到一些用python编写的解决方案,但这里的挑战是在JS中实现相同的功能。
非常感谢您的帮助。

例如,您有下一个数组(与您的数组类似,但要读取的属性较少):

因此,您将看到:

[ { key: 'pos2', val: { sum: 1, name: 'p2' } },
  { key: 'pos3', val: { sum: 50, name: 'p3' } },
  { key: 'pos1', val: { sum: 100, name: 'p1' } } ]

只需使用
object.values
检索内部对象,然后使用
Array.sort
按内容排序即可。请注意,不能对对象属性进行排序,因为默认情况下,对象属性是未排序的集合(或者至少,没有正确描述如何对对象的属性进行排序)

const dict={
“位置2”:{
“隐写术”:0,
"总和":200,,
“杂项”:100,
“web”:0,
“ppc”:0,
“加密”:0,
“管理员”:0,
“vuln”:0,
“取证”:0,
“硬件”:0,
“反向”:0,
侦察:100
}, 
“位置1”:{
‘总和’:100
},
“位置3”:{
‘总和’:250
}
};
函数orderBySubKey(输入,键){
返回Object.values(input).map(value=>value).sort((a,b)=>a[key]-b[key]);
}

log(orderBySubKey(dict,'sum')由于不能按属性对对象排序,因此需要将对象排序到数组中,然后对其排序。您可能不希望丢失每个嵌套对象(如POS2)的密钥,因此您希望将该密钥嵌入到对象中以确保安全

const obj={“POS2”:{“stegano”:0,“sum”:2200,“misc”:100,“web”:0,“ppc”:0,“crypto”:0,“admin”:0,“vuln”:0,“取证”:0,“hardware”:0,“reverse”:0,“recono”:100},“POS3”:{“stegano”:0,“sum”:1200,“misc”:100,“web”:0,“ppc”:0,“crypto”:0,“admin”:0,“vuln”:0,“取证”:0,“hardware”:0,“reverse”:0,“recono”:100},“pos”:4,“stegano”:0,“stegano”:1200,“misc”:100,“web”:0,“misc”:0,“misc”:0,“ppc”:0,“加密”:0,“管理”:0,“vuln”:0,“取证”:0,“硬件”:0,“反向”:0,“侦察”:100},“POS5”:{“隐写术”:0,“总和”:2001,“杂项”:100,“网络”:0,“ppc”:0,“加密”:0,“管理”:0,“vuln”:0,“取证”:0,“硬件”:0,“反向”:0,“侦察”:100}
//映射对象关键点
const out=Object.keys(obj.map)(key=>{
//在每次迭代中,返回对象及其新的键属性
返回{…obj[key],key}
//然后根据对象的和对数组进行排序
}).sort((a,b)=>a.sum-b.sum);

console.log(注销)
然后你会期望一个数组作为输出,是吗?对象是无序的属性集。所以当你谈到
排序时,你期望什么输出?谢谢你们,两位,谢谢你们的兴趣。起初我想把字典作为输出,但是把里面的元素重新组织,这样第一个元素的和就最小了呃。但是现在@trincot已经提到了,并且我做了检查,我明白了为什么这不起作用了。我的字典是JS中的一个对象,它的属性是无序的。所以,我想,有一个数组作为输出是Goan的方法,如果OP想要保留键名,比如
POS2
?@Andy是的,你说得对。我错过了输入参数是对象,不是数组。我修正了我的答案
[ { key: 'pos2', val: { sum: 1, name: 'p2' } },
  { key: 'pos3', val: { sum: 50, name: 'p3' } },
  { key: 'pos1', val: { sum: 100, name: 'p1' } } ]