计算2个极其简单的数组,一种排序正确,而另一种则不能:
var qtr = ['zzqtr_1_2020','zzqtr_2_2020','zzqtr_3_2019','zzqtr_4_2019'];
qtr.sort();
// qtr is now zzqtr_1_2020, zzqtr_2_2020, zzqtr_3_2019, zzqtr_4_2019 (no change)
var fruits = ["a_1_Banana", "a_2_Orange", "a_1_Apple", "a_1_Mango"];
fruits.sort();
// fruits is now a_1_Apple, a_1_Banana, a_1_Mango, a_2_Orange (SORTED!)
我不知道为什么qtr
数组不能正确排序?
答案 0 :(得分:2)
因为数组已经排序。区别在于“ zzqtr_”后面的ID。元素已经排序。
答案 1 :(得分:0)
Array.prototype.sort()
正在比较UTF-16序列,因此zzqtr_1, zzqtr_2, zzqtr_3, zzqtr_4
已经根据该文本进行了排序,此处的最后一行文本(年份)与此无关。
我假设您要按年份排序,因此在这种情况下,您需要实现一个自定义排序功能:
const qtr = ['zzqtr_1_2020','zzqtr_2_2020','zzqtr_3_2019','zzqtr_4_2019'];
qtr.sort((a, b) => {
const aParts = a.split('_');
const bParts = b.split('_');
return (parseInt(aParts[2]) - parseInt(bParts[2])) || a.localeCompare(b);
});
console.log(qtr.join(', '));
答案 2 :(得分:0)
该数组已经排序。 “ zzqtr_”之后的字符串按升序排列(即:从1到4)。因此,如果您做了这样的事情:
this.service.formData = {
ID : null,
title : '',
crn : '',
instructor: {
firstname: '',
lastname: '',
},
};
现在,您将看到一个变化:)
答案 3 :(得分:0)
Array.prototype.sort()
通过比较UTF-16代码点来工作,有时可能会导致意外结果。
请考虑使用String.prototype.localeCompare()
函数,该函数根据语言环境的字母而不是UTF-16代码点来比较两个字符串