我有一個需要按姓氏排序的物件陣列,但是該物件只有名字和全名引數,所以對于姓氏,我必須使用fullname.replace((firstname " "), ""). 下面的示例陣列。
const names = [
{
firstname: "John",
fullname: "John Doe"
},
{
firstname: "Amber",
fullname: "Amber Smith"
},
{
firstname: "Michael",
fullname: "Michael Smith"
},
{
firstname: "Jessica",
fullname: "Jessica Kelly Charles"
}
]
雖然我每次都可以在排序比較函式中使用“替換”,但我更喜歡這樣的東西:
names.sort(function(a, b) {
const lastname = fullname.replace((firstname " "), "");
if (a.lastname < b.lastname) {
return -1;
} else if (a.lastname > b.lastname) {
return 1;
}
return 0;
});
顯然,姓氏是未定義的。這很難用谷歌搜索,我認為我在這里缺少一些 JavaScript 基礎知識,但非常感謝您幫助我學習撰寫更好的代碼。
uj5u.com熱心網友回復:
您最好的選擇是修改陣列的來源,以便lastname在收集時存盤。
如果你不能這樣做:
除非您通過陣列添加lastname屬性進行準備傳遞,否則每次sort呼叫回呼時都必須計算它,對于a和b。
names.sort((a, b) => {
const alast = a.fullname.replace(a.firstname " "), "");
const blast = b.fullname.replace(b.firstname " "), "");
return alast.localeCompare(blast);
});
(請注意,我使用localeCompare,對于名稱和其他自然語言字串,它總是比<and更好的選擇>。例如,詢問法語是否?真的應該z像使用<and一樣>。;-))
但是,這將lastname重復為同一物件重新計算 ,因為同一物件可能會重復傳遞給sort(作為a或b)。如果你認為這可能是一個問題,你可以做我提到的那個準備通行證:
// Build a map of entry to last names
const lastnames = new Map(names.map(entry => {
const lastname = entry.fullname.replace(entry.firstname " ", "");
return [entry, lastname];
}));
// sort
names.sort((a, b) => {
return lastnames.get(a).localeCompare(lastnames.get(b));
});
uj5u.com熱心網友回復:
您只是在宣告一個新變數,試圖通過物件的屬性訪問它。您應該首先映射您的資料,例如:
const names = [
{
firstname: "John",
fullname: "John Doe"
},
{
firstname: "Amber",
fullname: "Amber Smith"
},
{
firstname: "Michael",
fullname: "Michael Smith"
},
{
firstname: "Jessica",
fullname: "Jessica Kelly Charles"
}
].map(person => ({
...person,
lastName: person.fullName.replace(person.firstName ' ', '')
}));
像這樣映射您的資料后,您可以在需要的地方使用 .lastName 。
names.sort(function(a, b) {
if (a.lastName < b.lastName) {
return -1;
} else if (a.lastName > b.lastName) {
return 1;
}
return 0;
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414905.html
標籤:
下一篇:基于另一列的一列中的值計數
