【问题标题】:Sort a JavaScript array of strings with years inside对包含年份的 JavaScript 字符串数组进行排序
【发布时间】:2020-08-15 04:22:02
【问题描述】:

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

【问题讨论】:

  • 它正在排序,但它已经按排序顺序。你希望有什么不同?
  • “qtr array”排序的预期结果是什么?
  • 我想知道他是否希望它被排序为日期,以便2019 项目应该排在2020 之前。
  • 如果你想得到按日期排序的数据,你可以考虑使用月份前面有年份的字符串,比如ISO 8601日期字符串。这是可排序的,尽管前缀相同。
  • @NinaScholz 也需要2位数的月份,否则12会排在3之前

标签: javascript arrays string sorting date


【解决方案1】:

因为数组已经排序。您的区别是由“zzqtr_”之后的 id 决定的。并且元素已经排序。

【讨论】:

    【解决方案2】:

    数组已经排序。 "zzqtr_" 之后的字符串是按递增顺序排列的(即:从 1 到 4)。所以,如果你做了这样的事情:

    var qtr = ['zzqtr_3_2020','zzqtr_1_2020','zzqtr_4_2019','zzqtr_1_2019'];
    qtr.sort();
    var x = qtr.toString();
    

    现在,你会看到变化:)

    【讨论】:

      【解决方案3】:

      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(', '));

      【讨论】:

        【解决方案4】:

        Array.prototype.sort() 通过比较 UTF-16 代码点来工作,这有时会导致意外结果。

        请考虑使用 String.prototype.localeCompare() 函数,该函数根据区域设置的字母而不是 UTF-16 代码点比较两个字符串

        【讨论】:

          猜你喜欢
          • 2011-03-07
          • 2020-02-18
          • 1970-01-01
          • 2023-01-01
          • 2011-07-23
          • 2019-05-26
          • 1970-01-01
          • 2015-07-07
          相关资源
          最近更新 更多