[英]Sort a array of objects lexicographically based on a nested value
使用Javascript,我想知道如何根據每個對象中的字符串值按字典順序對對象數組進行排序。
考慮:
[
{
"name" : "bob",
"count" : true
"birthday" : 1972
},
{
"name" : "jill",
"count" : false
"birthday" : 1922
},
{
"name" : "Gerald",
"count" : true
"birthday" : 1920
}
]
如何按名稱按字母順序對數組進行排序? 名稱值是用戶名,所以我想保持字母大小寫。
var obj = [...];
obj.sort(function(a,b){return a.name.localeCompare(b.name); });
請注意,這不會考慮大寫(因此它會將所有以大寫開頭的名稱排序在所有以小寫開頭的名稱之前,即"Z" < "a"
),因此您可能會發現添加toUpperCase()
與那里。
你也可以讓它更通用:
function sortFactory(prop) {
return function(a,b){ return a[prop].localeCompare(b[prop]); };
}
obj.sort(sortFactory('name')); // sort by name property
obj.sort(sortFactory('surname')); // sort by surname property
如果您將比較器傳遞給工廠,則更通用......
這將做到:
arr.sort(function(a, b) {
return a.name.localeCompare(b.name);
});
使用比較
arr.sort(function (a, b) {return a.name.toLowerCase() > b.name.toLowerCase()})
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String#Comparing_strings
我在這篇文章中閱讀了javascript 中的按字典序排序數組,只是直接使用 sort 而不是localeCompare
,這似乎可以解決問題。
localeCompare
不按字典順序排序。
'aaA'.localeCompare('aAA')
返回-1
,它在aaA
之前aAA
aaA
進行aAA
。 在 lex 中,首字母大寫,所以它應該是['aAA', 'aaA']
你可以做這樣的事情來處理一些情況。
export default function sortLex ({ arr, prop, reverse }) {
let sorted
if (prop) {
sorted = arr.sort(sortFactory(prop))
} else sorted = arr.sort(sort)
return reverse ? sorted.reverse() : sorted
}
function sort (a, b) {
if (a < b) {
return -1
}
if (a === b) {
return 0
}
if (a > b) {
return 1
}
}
function sortFactory (prop) {
return (a, b) => {
return sort(a[prop], b[prop])
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.