如何按值的字母顺序对对象进行排序?

How can I sort an object alphabetically by value?

所以我有一个国家列表,默认情况下它们按 ISOA2 代码排序,这是某种国家代码。

说这个列表:

{
  "AD": "Andorra",
  "AE": "United Arab Emirates",
  "AF": "Afghanistan",
  "AG": "Antigua and Barbuda",
  "AI": "Anguilla",
  "AL": "Albania",
  "AM": "Armenia",
  "AN": "Netherlands Antilles",
  "GB": "United Kingdom"
}

我有这个代码:

    function sortObject(obj) {
      return Object
        .keys(obj)
        .sort()
        .reduce((a, v) => {
          a[v] = obj[v];
          return a;
        }, {});
    }

    
    // data is the list of countries
    const result = sortObject(data);

我正在尝试使用该代码对其进行排序,但它总是 returns 相同的列表。

我需要这样的列表:

{
  "AF": "Afghanistan",
  "AL": "Albania",
  "AD": "Andorra",
  "AI": "Anguilla",
  "AG": "Antigua and Barbuda",
  "AM": "Armenia",
  "AN": "Netherlands Antilles",
  "AE": "United Arab Emirates",
  "GB": "United Kingdom"
}

我做错了什么?

你可以在这里玩:

https://codesandbox.io/s/js-playground-forked-xk005?file=/src/index.js

您将在控制台中看到结果。

Object.entries按值排序,然后使用Object.fromEntries将这个键值对数组变回一个对象:

 Object.fromEntries(
   Object.entries(obj)
    .sort(([keyA, valueA], [keyB, valueB]) => valueA.localeCompare(valueB))
  )

请注意,如果有数字键或对象发生变异(因为这会再次更改排序顺序),则对对象进行排序是没有意义的。

试试这个排序:

const sortObject = obj => {
  const ret = {}
  Object.values(obj)
      .sort()
      .forEach(val => {
          const key = Object.keys(obj).find(key => obj[key] === val)
          ret[key] = val
      })
  return ret
}

这对你有用吗?

function sortObject(obj) {
  return Object.fromEntries(Object
    .entries(obj)
    .sort((a,b)=>a[1].localeCompare(b[1])));
}

const data = {
  "AD": "Andorra",
  "AE": "United Arab Emirates",
  "AF": "Afghanistan",
  "AG": "Antigua and Barbuda",
  "AI": "Anguilla",
  "AL": "Albania",
  "AM": "Armenia",
  "AN": "Netherlands Antilles",
  "GB": "United Kingdom"
}

// data is the list of countries
const result = sortObject(data);

console.log(result);