首页 > 解决方案 > 如何先用字母排序对象数组,然后再用数字排序

问题描述

代码:

keyword.sort((a, b) => a.Acr.localeCompare(b.Acr));

电流输出:

[{
        "Id": 947,
        "Acr": 502,
        "Definition": "ADefBulk6",
        "index": 0
    }, {
        "Id": 762,
        "Acr": "AO",
        "Definition": "Anti",
        "ID": 762,
        "index": 1
    }, {
        "Id": 72,
        "Acr": "AW",
        "Definition": "Corporate",
        "ID": 762,
        "index": 1
    }
]

预期输出:

[{
        "Id": 947,
        "Acr": "AO",
        "Definition": "ADefBulk6",
        "index": 0
    }, {
        "Id": 762,
        "Acr": "AW",
        "Definition": "Anti",
        "ID": 762,
        "index": 1
    }, {
        "Id": 72,
        "Acr": 502,
        "Definition": "Corporate",
        "ID": 762,
        "index": 1
    }
]

标签: javascriptreactjs

解决方案


如果两个值Acr都是字符串,则可以检查排序回调,如果是,则返回字符串比较的结果。如果只有一个值是字符串,则赋予它优先级,并且如果它们都不是字符串(我假设您只有数字和字符串作为它们的值),则返回值的(有符号)差。这样的事情应该这样做:

const arr=[
{"Id":949,"Acr":900,"Definition":"ADefBulk6","index":0},
{"Id":947,"Acr":502,"Definition":"ADefBulk6","index":0},
{"Id":762,"Acr":"AW","Definition":"Anti","ID":762,"index":1},
{"Id":72,"Acr":"AO","Definition":"Corporate","ID":762,"index":1},
{"Id":76,"Acr":"AA","Definition":"Corporate","ID":762,"index":1}];

arr.sort((a, b) => {
    if (typeof a.Acr === 'string' && typeof b.Acr === 'string') {
        return a.Acr.localeCompare(b.Acr);
    } else if (typeof a.Acr === 'string') {
        return -1;
    } else if (typeof b.Acr === 'string') {
        return 1;
    } else {
        return Math.sign(a.Acr - b.Acr);
    }
});

console.log(arr);

对于带有数字字符串的值,您可以执行以下操作:

const arr = [
    {"Id": 949, "Acr": "900", "Definition": "ADefBulk6", "index": 0},
    {"Id": 947, "Acr": "502", "Definition": "ADefBulk6", "index": 0},
    {"Id": 762, "Acr": "AW", "Definition": "Anti", "ID": 762, "index": 1},
    {"Id": 72, "Acr": "AO", "Definition": "Corporate", "ID": 762, "index": 1},    
    {"Id":73,  "Acr": "401(c)(d)","Definition":"Corporate","ID":762,"index":1},
    {"Id": 76, "Acr": "AA", "Definition": "Corporate", "ID": 762, "index": 1}];

arr.sort((a, b) => {
    const nrA = Number.parseInt(a.Acr);
    const nrB = Number.parseInt(b.Acr);

    if (isNaN(nrA) && isNaN(nrB)) {
        return a.Acr.localeCompare(b.Acr);
    } else if (isNaN(nrA)) {
        return -1;
    } else if (isNaN(nrB)) {
        return 1;
    } else {
        return Math.sign(nrA - nrB);
    }
});

console.log(arr);


推荐阅读