无法按多个属性对数组进行排序



我有这个字符串Mario:Rossi;Giuseppe:Bianchi;Roberta:Rossi;Alessia:Verdi;Federico:Bianchi;Cristina:Verdi;Andrea:Rossi

我需要按姓氏订购,如果按名字相等,这是预期的输出:

[“BIANCHI FEDERICO”, “BIANCHI GIUSEPPE”, “ROSSI ANDREA”, “ROSSI MARIO”, “ROSSI ROBERTA”, “VERDI ALESSIA”, “VERDI CRISTINA”];

我做了什么:

let input = "Mario:Rossi;Giuseppe:Bianchi;Roberta:Rossi;Alessia:Verdi;Federico:Bianchi;Cristina:Verdi;Andrea:Rossi";
let inputArr = input.split(';');
inputArr = inputArr.map(function(v, i, a) {
let fullName = v.split(":");
return {
firstName: fullName[0],
lastName: fullName[1]
};
});
function orderByProp(inputArr, prop) {
return inputArr.sort(function(a, b) {
var nameA = a[prop].toLowerCase(),
nameB = b[prop].toLowerCase();
if (nameA < nameB)
return -1;
if (nameA > nameB)
return 1;
if (nameA === nameB)
return -1
return 0;
});
}
let inputArrOrdered = orderByProp(inputArr, 'firstName');
inputArrOrdered = orderByProp(inputArr, 'lastName');

console.log(inputArrOrdered);

但如果姓氏等于,则结果不正确

排序,默认情况下将按字母顺序排序。所以你只需要一对split和一个排序

let input = "Mario:Rossi;Giuseppe:Bianchi;Roberta:Rossi;Alessia:Verdi;Federico:Bianchi;Cristina:Verdi;Andrea:Rossi";

const sortedCapitalized = input
.split(';') // split the different names
.map(name => name
.split(':') // split the name to first/last
.reverse() // reverse so it becomes last/first
.join(' ') // join to create a full name string
.toUpperCase())
.sort();
console.log(sortedCapitalized);


现在,如果问题只是你得到了错误的结果,那是因为当值相等时,你返回了-1。如果您完全移除该部分,它应该可以按预期工作。

最新更新