我有一组名称,我想首先按last name
,然后按first name
,最后按middle name
进行排序。 middle name
可以大于1
。例如,如果我有一个名称如下的数组:
["James Morrison", "Billy Z Joel", "Billy Joel", "Billy A Joel"]
如何将其排序为:
["Billy Joel", "Billy A Joel", "Billy Z Joel", "James Morrison"]
答案 0 :(得分:1)
一种解决方案是使用String.match()和正则表达式将surname
与Array.sort()中的other names
分开。然后,您可以使用String.localeCompare()首先比较surnames
,如果它们相等,则比较other names
。请注意,在这种方法下,您将需要为数组上的每个元素分别获取一个first name
和一个surname
,否则它将不起作用。此外,方法Array.slice()仅用于不改变(更改)原始数组的目的,但是如果您不介意,则可以将其丢弃。
const names = ["James Morrison","Billy Z Joel","Billy Joel","Billy A Joel", "James Junior Joseph Morrison"];
let res = names.slice().sort((a, b) =>
{
let [aNames, aSurname] = a.match((/(.*)\s(\w+)$/)).slice(1);
let [bNames, bSurname] = b.match((/(.*)\s(\w+)$/)).slice(1);
if (aSurname.localeCompare(bSurname))
return aSurname.localeCompare(bSurname);
else
return aNames.localeCompare(bNames);
});
console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}