我有一个看起来像这样的数组
var arr = [
{
firstName: 'Maria',
lastName: 'S.',
country: 'Peru',
continent: 'Americas',
age: 30,
language: 'C'
}, {
firstName: 'Agustin',
lastName: 'V.',
country: 'Uruguay',
continent: 'Americas',
age: 19,
language: 'JavaScript'
}, {
firstName: 'Precious',
lastName: 'G.',
country: 'South Africa',
continent: 'Africa',
age: 22,
language: 'JavaScript'
}, {
firstName: 'Nikau',
lastName: 'R.',
country: 'New Zealand',
continent: 'Oceania',
age: 39,
language: 'Ruby'
}
]
我按照编程语言按字母顺序排列数组。但是,在某些情况下,有些开发人员使用相同的语言进行编码,然后我想按名字的字母顺序排序:
我写了以下我认为应该有效的功能。
首先,我按字母顺序对语言进行排序,然后在第二个排序函数中,如果语言相同,则应按字母顺序按名字排序。我认为错误最有可能发生在a.language != b.language
但我不确定的情况下我将要返回的内容。
请参阅下面的代码。谁能发现我误解的地方?
function sortByLanguage(list) {
return list.sort((a, b) => {
if(a.language < b.language) return -1;
if(a.language > b.language) return 1;
return 0;
}).sort((a, b) => {
if(a.language === b.language) {
if(a.firstName < b.firstName) return -1;
if(a.firstName > b.firstName) return 1;
return 0;
}
return 0;
});
}
答案 0 :(得分:3)
您首先尝试按语言对数组进行排序,然后使用第一个名称再次排序。这不起作用,因为第二次排序不尊重第一次排序。
您可以使用默认运算符(logical OR ||
)来使用链式方法,这意味着如果第一部分未解析为真值,则会评估第二部分。
return a.language.localeCompare(b.language) || a.firstName.localeCompare(b.firstName);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// sort first by language and if equal
// it returns zero, then the other part
// is evaluated
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// sort by firstName
var array = [{ firstName: 'Maria', lastName: 'S.', country: 'Peru', continent: 'Americas', age: 30, language: 'C' }, { firstName: 'Agustin', lastName: 'V.', country: 'Uruguay', continent: 'Americas', age: 19, language: 'JavaScript' }, { firstName: 'Precious', lastName: 'G.', country: 'South Africa', continent: 'Africa', age: 22, language: 'JavaScript' }, { firstName: 'Nikau', lastName: 'R.', country: 'New Zealand', continent: 'Oceania', age: 39, language: 'Ruby' }]
array.sort(function (a, b) {
return a.language.localeCompare(b.language) || a.firstName.localeCompare(b.firstName);
});
console.log(array);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;