如何按值的字母顺序对对象进行排序?
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);
所以我有一个国家列表,默认情况下它们按 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);