按键值 0 按数字大小对对象排序

sort objects by key value 0 by number size

如何按 user_id 对这个对象进行排序?

{
 key_1: { user_id: 3 },
 key_2: { user_id: 1 },
 key_3: { user_id: 2 }
}

我需要这个:

{
 key_2: { user_id: 1 },
 key_3: { user_id: 2 },
 key_1: { user_id: 3 }
}

感谢帮助

ES6 规定了对象键的遍历顺序(见此article):

  • 按数字升序排列的整数索引。
  • 然后,所有其他字符串键,按照它们被添加到对象的顺序。
  • 最后,所有符号键,按照它们被添加到对象的顺序。

这意味着只要您使用字符串或符号(不是两者)的非整数键,您就可以通过使用按您需要的插入顺序创建新对象来“排序”对象键。

例如,使用 Object.entries() 得到一个 [key, value] 对的数组,按 user_id 排序,然后使用 Object.fromEntries() 转换回对象:

const obj = { key_1: { user_id: 3 }, key_2: { user_id: 1 }, key_3: { user_id: 2 }}

const result = Object.fromEntries(
  Object.entries(obj)
    .sort(([, a], [, b]) => a.user_id - b.user_id)
)
  
console.log(result)

但是,对于具有整数键的对象,这将失败:

const obj = { 1: { user_id: 3 }, 2: { user_id: 1 }, 3: { user_id: 2 }}

const result = Object.fromEntries(
  Object.entries(obj)
    .sort(([, a], [, b]) => a.user_id - b.user_id)
)
  
console.log(result)

因此,创建一个键数组,按您想要的顺序对其进行排序,然后使用它按该顺序获取 属性 个值会更好,也更不容易出错:

const obj = { key_1: { user_id: 3 }, key_2: { user_id: 1 }, key_3: { user_id: 2 }}

const result = Object.keys(obj)
  .sort((a, b) => obj[a].user_id - obj[b].user_id)
  
console.log(result.forEach(key => console.log(obj[key])))

你不能。我认为你错过了对象和数组的本质。对象中属性的顺序无关紧要。当然,在一个数组中它可能。

例如,如果您收到一个对象并且想要显示已排序的数据,我建议您将该对象转换为数组然后对其进行排序:

const object = {
  key_1: {
    user_id: 3
  },
  key_2: {
    user_id: 1
  },
  key_3: {
    user_id: 2
  }
};
const array = Object.entries(object)
const sortedArray = array.sort(([, aValue], [, bValue]) => aValue.user_id > bValue.user_id)

console.log(sortedArray)