【问题标题】:Javascript Sort mixed alpa/numerical in the format A1, B1, C1 etcJavascript 以 A1、B1、C1 等格式对混合的 alpa/数字进行排序
【发布时间】:2021-01-13 17:16:36
【问题描述】:

我在这里尝试了两个类似问题的变体:

Sort mixed alpha/numeric array

这里:

Sort mixed alpha/numeric Array in javascript

但无法正确排序算法。

例如这个解决方案:

const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })`

["A1", "A2", "A3"...] 的格式提供,而我希望以["A1", "B1", "C1"...] 的格式提供。

数组的范围从 A1M30 如果有帮助,那么只有一个字母,但两个数字。

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    这样的一些可能会有所帮助

    const sortAlphaNum = (a, b) => parseInt(a.replaceAll(/[A-Z]+/ig, '')) - parseInt(b.replaceAll(/[A-Z]+/ig, '')) || a.localeCompare(b);
    

    它所做的是从值中删除任何字母并仅比较数字,如果数字相同,则使用localeCompare进行排序

    【讨论】:

    • 谢谢。我最喜欢这个答案,因为它很简单
    【解决方案2】:

    对于您拥有的特定输入范围,您可以将值从 A9 映射到 99A 格式,按字母顺序排序,然后将它们映射回来。这样做的好处是在排序期间不会发生映射,这是最昂贵的步骤:

    let data = ["M12", "K2", "E2", "A3", "A22"];
    
    let result = data.map(s => s.slice(1).padStart(2, "0") + s[0])
                     .sort()
                     .map(s => s[2] + parseInt(s));
                     
    console.log(result);

    【讨论】:

      【解决方案3】:

      您可以分成字母和数字部分并进行相应的排序:

      const src = ['C2', 'A1', 'B2', 'A2', 'B1', 'C1'],
            splitAlphaNum = s => s.match(/([A-Z])(\d+)/).slice(1)
      
            result = src.sort((a,b) => {
              const [a1, n1] = splitAlphaNum(a),
                    [a2, n2] = splitAlphaNum(b)
              return n1-n2 || a1.localeCompare(a2)
            })
            
      console.log(result)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-15
        • 1970-01-01
        • 2021-09-23
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多