js对象元素排序问题

let obj = {
    上海: [100, 200, 300],
    广州: [80, 100, 220],
    北京: [120, 130, 160],
    深圳: [99, 150, 180]
};

要求:按照每一个元素的数组的第一个值从大到小排序,排序后的结果是

{
    北京: [120, 130, 160],
    上海: [100, 200, 300],
    深圳: [99, 150, 180],
    广州: [80, 100, 220],
};

有什么高级高效的方法呢

阅读 3.1k
4 个回答

对象本身是无序的。
如果需要有序的映射,你可以用Map。

js 对象不能直接排序,只能把 key 拿出来,排序,然后用 key 访问

let obj = {
    上海: [100, 200, 300],
    广州: [80, 100, 220],
    北京: [120, 130, 160],
    深圳: [99, 150, 180]
};
let newobj = {};
let keysSorted = Object.keys(obj).sort(function (a, b) { 
    return obj[b][0] - obj[a][0] }
);
for (let i = 0; i < keysSorted.length; i++) {
    newobj[keysSorted[i]] = obj[keysSorted[i]];
}
console.log(newobj);

对象没有顺序的,只能帮你排序成数组了:

import { pipe, sort, toPairs, descend, path } from 'ramda'

const obj = {
    上海: [100, 200, 300],
    广州: [80, 100, 220],
    北京: [120, 130, 160],
    深圳: [99, 150, 180]
}

const sortedArray = pipe(
  toPairs,
  sort(descend(path([1, 0])))
)(obj)
// sortedArray:
// [["北京", [120, 130, 160]], ["上海", [100, 200, 300]], ["深圳", [99, 150, 180]], ["广州", [80, 100, 220]]]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题