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

假设我有一个对象 {'a':20,'b':6,'c':21,'d':12}

按降序对值进行排序后,所需的输出:Keys: ['c','a','d','b']Values: [21,20,12,6]

我怎样才能有效地实现这一目标?我开始知道我们不能根据值对 js 对象键进行排序,因为键的顺序每次都是随机的。


开心每一天1111
浏览 201回答 3
3回答

猛跑小猪

我开始知道我们不能根据值对 js 对象键进行排序,因为键的顺序每次都是随机的。这不是真的(它不是随机的,而且每次都不同),但是对 JavaScript对象进行排序几乎从来没有用。您有多种选择来获取您显示的数组。一个简单的方法是使用Object.entries获取一组[key, value]数组,然后sort通过map以下方式从中获取键: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.entriespolyfill):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) {。)

烙印99

const obj = {'a':20,'b':6,'c':21,'d':12};const result = Object.keys(obj)  .reduce((acc, key) => {    const value = obj[key];    acc.push({ key, value });    acc.sort((a, b) => b.value - a.value);    return acc;  }, []);console.log(result);输出[  { key: 'c', value: 21 },  { key: 'a', value: 20 }  { key: 'd', value: 12 }  { key: 'b', value: 6 }]

PIPIONE

尝试这个。const list = {'a':20,'b':6,'c':21,'d':12};let myObject = Object.fromEntries(Object.entries(list).sort( (a,b) => b[1] - a[1] ));Object.prototype.mySplit = function() {&nbsp; return Object.keys(this).map((key) => {&nbsp; &nbsp; return {&nbsp; &nbsp; &nbsp; key: key,&nbsp; &nbsp; &nbsp; value: this[key]&nbsp; &nbsp; };&nbsp; });}let keys = [];let values = [];let properties = myObject.mySplit();for (var i = 0; i < properties.length; i++) {&nbsp; &nbsp; keys.push(properties[i]['key']);&nbsp; &nbsp; values.push(properties[i]['value']);}console.log(keys);console.log(values);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript