javascript - 如何先用字母排序对象数组,然后再用数字排序
问题描述
代码:
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
}
]
解决方案
如果两个值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);