为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

开心每一天1111 2021-12-02 15:35:38
假设我有一个对象 {'a':20,'b':6,'c':21,'d':12}按降序对值进行排序后,所需的输出:Keys: ['c','a','d','b']和Values: [21,20,12,6]我怎样才能有效地实现这一目标?我开始知道我们不能根据值对 js 对象键进行排序,因为键的顺序每次都是随机的。
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

我开始知道我们不能根据值对 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) {。)


查看完整回答
反对 回复 2021-12-02
?
烙印99

TA贡献1829条经验 获得超13个赞

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 }

]


查看完整回答
反对 回复 2021-12-02
?
PIPIONE

TA贡献1829条经验 获得超9个赞

尝试这个。


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() {

  return Object.keys(this).map((key) => {

    return {

      key: key,

      value: this[key]

    };

  });

}


let keys = [];

let values = [];


let properties = myObject.mySplit();

for (var i = 0; i < properties.length; i++) {

    keys.push(properties[i]['key']);

    values.push(properties[i]['value']);

}


console.log(keys);

console.log(values);


查看完整回答
反对 回复 2021-12-02
  • 3 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信