Javascript-先对字母排序,然后对数字排序

Javascript-先对字母排序,然后对数字排序,javascript,sorting,Javascript,Sorting,我有一个数组,类似于: ['honda accord', '1986 honda accord', '1990 honda accord', '2000 honda accord', '2011 honda accord', '2016 honda accord']. 我需要在javascript中对此进行排序,以便得到以下结果: ['honda accord', '2016 honda accord', '2011 honda accord', '2000 honda accord', '1

我有一个数组,类似于:

['honda accord', '1986 honda accord', '1990 honda accord', '2000 honda accord', '2011 honda accord', '2016 honda accord'].
我需要在javascript中对此进行排序,以便得到以下结果:

['honda accord', '2016 honda accord', '2011 honda accord', '2000 honda accord', '1990 honda accord', '1986 honda accord'].
我怎样才能做到这一点

array.sort() 
不起作用。 我知道我需要发送一个函数进行排序

谢谢
Brian

您可以使用
split
并检查字符串的第一项

var arr=[‘本田雅阁’、‘1986本田雅阁’、‘1990本田雅阁’、‘2000本田雅阁’、‘2011本田雅阁’、‘2016本田雅阁’];
arr.sort((a,b)=>b.split(“”)[0]-a.split(“”)[0])

document.write(JSON.stringify(arr))工作小提琴:

我希望它能起作用。

它不是很优雅(或高效),但它能起作用。本质上,它使用正则表达式从每辆车中提取年份,然后进行比较

// the regular expression to extract the year and car
var regEx = /((\d+)\s)*(.*)/;

var list = ['honda accord', '1986 honda accord', '1990 honda accord', '2000 honda accord', '2011 honda accord', '2016 honda accord'];

// custom sort function
list.sort(function(a, b)
{
    // get the car details
    var aR = regEx.exec(a);
    var bR = regEx.exec(b);

    var aCar = aR[3];
    var bCar = bR[3];

    var aYear = aR[2];
    var bYear = bR[2];

    // compare the strings
    if(aCar < bCar) return -1;
    else if(aCar > bCar) return 1;
    // we'll only get this far if both strings are the same

    // if there was no year provided then it should be first
    else if(!aYear) return -1;
    else if(!bYear) return 1;

    // at this point the car types are the same, and both have an year so compare the year
    else if(aYear < bYear) return 1;
    else if(aYear > bYear) return -1;
    return 0;
})
//用于提取年份和汽车的正则表达式
var regEx=/(\d+)\s)*(.*)/;
var列表=[‘本田雅阁’、‘1986本田雅阁’、‘1990本田雅阁’、‘2000本田雅阁’、‘2011本田雅阁’、‘2016本田雅阁’];
//自定义排序函数
列表.排序(函数(a,b)
{
//获取汽车的详细信息
var aR=regEx.exec(a);
var bR=regEx.exec(b);
var aCar=aR[3];
var bCar=bR[3];
var aYear=aR[2];
var bYear=bR[2];
//比较字符串
如果(aCarbCar)返回1;
//只有两个字符串相同,我们才能走到这一步
//如果没有提供年份,那么应该是第一年
否则如果(!aYear)返回-1;
否则如果(!bYear)返回1;
//在这一点上,汽车类型是相同的,都有一年,所以比较一年
否则如果(一年<一年)返回1;
否则如果(aYear>bYear)返回-1;
返回0;
})

通过对列表进行预处理,在所有项目上运行正则表达式,可以提高效率。

如果没有给出年份,则使用replace解决方案

var数组=[“本田雅阁”、“1986本田雅阁”、“1990本田雅阁”、“2000本田雅阁”、“2011本田雅阁”、“2016本田雅阁”];
array.sort((a,b)=>b.replace(/^\D*$/g,'9999$1')。localeCompare(a.replace(/^\D*$/g,'9999$1'));
write(“”+JSON.stringify(数组,0,4)+“”)
// the regular expression to extract the year and car
var regEx = /((\d+)\s)*(.*)/;

var list = ['honda accord', '1986 honda accord', '1990 honda accord', '2000 honda accord', '2011 honda accord', '2016 honda accord'];

// custom sort function
list.sort(function(a, b)
{
    // get the car details
    var aR = regEx.exec(a);
    var bR = regEx.exec(b);

    var aCar = aR[3];
    var bCar = bR[3];

    var aYear = aR[2];
    var bYear = bR[2];

    // compare the strings
    if(aCar < bCar) return -1;
    else if(aCar > bCar) return 1;
    // we'll only get this far if both strings are the same

    // if there was no year provided then it should be first
    else if(!aYear) return -1;
    else if(!bYear) return 1;

    // at this point the car types are the same, and both have an year so compare the year
    else if(aYear < bYear) return 1;
    else if(aYear > bYear) return -1;
    return 0;
})