对包含年份的JavaScript字符串数组进行排序

时间:2020-04-30 17:45:05

标签: javascript arrays string sorting date

计算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数组不能正确排序?

4 个答案:

答案 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代码点来比较两个字符串