javascript - 获取按值排序的单独数组中的值和键

标签 javascript object

假设我有一个对象{'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/

相关文章:

javascript - 如何重新渲染(而不是重新采样) Canvas ?

javascript - 无法访问数组中的对象,只能访问对象本身

java - 声明类对象的正确方法是什么?

javascript - 我的正则表达式与数字不匹配

javascript - 绑定(bind)到滚轮然后使用正常滚动

javascript - 水平菜单子(monad)菜单

JavaScript 将具有特定结构的对象转换为数组

javascript - 为什么 forEach 方法在 IE 中会崩溃?

java - 类的序列化、演化

c++ - 在我的类 C++ 中创建一个对象