假设我有一个对象{'a':20,'b':6,'c':21,'d':12}
按值降序排序后,
所需的输出:键:['c','a','d','b']
和值:[21,20,12,6]
如何才能有效地实现这一目标?我开始知道我们不能根据值对 js 对象键进行排序,因为键的顺序每次都是随机的。
最佳答案
I came to knew that we cannot we cant sort js object keys based on values, since the order of keys is random everytime.
这不是真的(它不是随机的,而且每次都不同),但是对 JavaScript 对象进行排序几乎没有用。
您有多种选择来获取所显示的数组。一个简单的方法是使用 Object.entries
获取一组 [key, value]
数组,然后对其进行排序
,然后仅获取通过 map
获取的 key :
const obj = {'a':20,'b':6,'c':21,'d':12};
const keys = Object.entries(obj)
.sort(([k1, v1], [k2, v2]) => v2 - v1)
.map(([k, v]) => k);
console.log(keys);
Object.entries
相对较新,但如果需要,可以轻松进行填充。
如果您在 ES5 中需要它(使用 Object.entries
polyfilled):
var obj = {'a':20,'b':6,'c':21,'d':12};
var keys = Object.entries(obj)
.sort(function(e1, e2) {
return e2[1] - e1[1];
})
.map(function(e) {
return e[0];
});
console.log(keys);
在评论中,您询问了如何将值放在单独的数组中。您可以通过插入该值数组作为 map
的副作用来构建它,如下所示:
const obj = {'a':20,'b':6,'c':21,'d':12};
const values = [];
const keys = Object.entries(obj)
.sort(([k1, v1], [k2, v2]) => v2 - v1)
.map(([k, v]) => {
values.push(v);
return k;
});
console.log(keys);
console.log(values);
...或者如果使用 map
产生副作用让您烦恼(这通常不是最佳实践),只需使用 forEach
(或 for-of
) 改为:
const obj = {'a':20,'b':6,'c':21,'d':12};
const keys = [];
const values = [];
Object.entries(obj)
.sort(([k1, v1], [k2, v2]) => v2 - v1)
.forEach(([k, v]) => {
keys.push(k);
values.push(v);
});
console.log(keys);
console.log(values);
for-of
版本:
const obj = {'a':20,'b':6,'c':21,'d':12};
const keys = [];
const values = [];
for (const [k, v] of Object.entries(obj).sort(([k1, v1], [k2, v2]) => v2 - v1)) {
keys.push(k);
values.push(v);
}
console.log(keys);
console.log(values);
(您可以使用临时变量作为 .sort
的结果,然后使用 for (const [k, v] of theTemporaryVariable) {
。)
关于javascript - 获取按值排序的单独数组中的值和键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540292/