如何在Javascript中先按姓氏然后按名和中间名对名称数组进行排序

时间:2019-03-10 03:09:54

标签: javascript arrays sorting

我有一组名称,我想首先按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"]

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用String.match()和正则表达式将surnameArray.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;}