对混合的字母/数字数组排序

sol*_*ald 55 javascript arrays sorting jquery

我有一个混合数组,我需要按字母顺序排序,然后按数字排序

[A1, A10, A11, A12, A2, A3, A4, B10, B2, F1, F12, F3]
Run Code Online (Sandbox Code Playgroud)

我如何将其排序为:

[A1, A2, A3, A4, A10, A11, A12, B2, B10, F1, F3, F12]
Run Code Online (Sandbox Code Playgroud)

我试过了

arr.sort(function(a,b) {return a - b});
Run Code Online (Sandbox Code Playgroud)

但是只按字母顺序对其进行排序.可以使用直接JavaScript或jQuery完成吗?

epa*_*llo 85

var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;

function sortAlphaNum(a, b) {
  var aA = a.replace(reA, "");
  var bA = b.replace(reA, "");
  if (aA === bA) {
    var aN = parseInt(a.replace(reN, ""), 10);
    var bN = parseInt(b.replace(reN, ""), 10);
    return aN === bN ? 0 : aN > bN ? 1 : -1;
  } else {
    return aA > bA ? 1 : -1;
  }
}
console.log(
["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum)
)
Run Code Online (Sandbox Code Playgroud)

  • 所以追赶一点......但你不需要'else`块,因为第一个`if`将`return`如果`aA === bA` (4认同)
  • 这是一个很好的答案,但非常需要评论.我花了一些时间来阅读这篇文章并让它变得有意义. (4认同)
  • @Noitidart 偏好。两者应该没有区别。 (2认同)
  • @epascarello 当我找到它时,我真的很感激它 - 当你第一次看到它时,它只是有点令人困惑。它很简洁,但没有按主题命名,如果您不熟悉正则表达式、三元或一般排序,那么理解起来有点飞跃。字母数字排序是一个非常常见的问题,并且提出这个问题只需要粗略的数组知识,因此假设更多的知识会让人们要求评论。这是一个很好的答案和您的特权,但描述可能会让每个感兴趣的人更容易消化。 (2认同)

Jon*_*att 28

const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })`
Run Code Online (Sandbox Code Playgroud)

用法:

const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })
console.log(['A1', 'A10', 'A11', 'A12', 'A2', 'A3', 'A4', 'B10', 'B2', 'F1', 'F12', 'F3'].sort(sortAlphaNum))
Run Code Online (Sandbox Code Playgroud)

得到:

["A1", "A2", "A3", "A4", "A10", "A11", "A12", "B2", "B10", "F1", "F3", "F12"]

您可能必须将'en'参数更改为您的语言环境或以编程方式确定,但这适用于英语字符串.

localeCompare没有超一贯支持,但如果与你的通天塔那transpiling将不会是一个问题


cmc*_*loh 8

我有类似的情况,但是,有一个字母数字和数字混合,需要先排序所有数字后跟字母数字,所以:

A10
1
5
A9
2
B3
A2
Run Code Online (Sandbox Code Playgroud)

需要成为:

1
2
5
A2
A9
A10
B3
Run Code Online (Sandbox Code Playgroud)

我能够使用提供的算法并在其上进行更多操作来实现此目的:

var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a,b) {
    var AInt = parseInt(a, 10);
    var BInt = parseInt(b, 10);

    if(isNaN(AInt) && isNaN(BInt)){
        var aA = a.replace(reA, "");
        var bA = b.replace(reA, "");
        if(aA === bA) {
            var aN = parseInt(a.replace(reN, ""), 10);
            var bN = parseInt(b.replace(reN, ""), 10);
            return aN === bN ? 0 : aN > bN ? 1 : -1;
        } else {
            return aA > bA ? 1 : -1;
        }
    }else if(isNaN(AInt)){//A is not an Int
        return 1;//to make alphanumeric sort first return -1 here
    }else if(isNaN(BInt)){//B is not an Int
        return -1;//to make alphanumeric sort first return 1 here
    }else{
        return AInt > BInt ? 1 : -1;
    }
}
var newlist = ["A1", 1, "A10", "A11", "A12", 5, 3, 10, 2, "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum);
Run Code Online (Sandbox Code Playgroud)


Cod*_*iac 7

您可以使用 Intl.Collator

Read here 相比,它具有性能优势localeCompare

浏览器可比性(所有浏览器都支持)

let arr = ["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"]

let op = arr.sort(new Intl.Collator('en',{numeric:true, sensitivity:'accent'}).compare)

console.log(op)
Run Code Online (Sandbox Code Playgroud)

  • 我尝试在 Node.js 中对此进行基准测试,它比 localeCompare 答案快得多。我测试了超过 1000 次迭代,localeCompare 花费了 3.159 秒,而 Intl.Collat​​or 在相同条件下仅花费了 200.178 毫秒,非常令人印象深刻。 (2认同)

小智 5

一种简单的方法是使用https://www.w3schools.com/jsref/jsref_localecompare.asp的localeCompare()方法JavaScript

例:

export const sortAlphaNumeric = (a, b) => {
    // convert to strings and force lowercase
    a = typeof a === 'string' ? a.toLowerCase() : a.toString();
    b = typeof b === 'string' ? b.toLowerCase() : b.toString();

    return a.localeCompare(b);
};
Run Code Online (Sandbox Code Playgroud)

预期行为:

1000X Radonius Maximus
10X Radonius
200X Radonius
20X Radonius
20X Radonius Prime
30X Radonius
40X Radonius
Allegia 50 Clasteron
Allegia 500 Clasteron
Allegia 50B Clasteron
Allegia 51 Clasteron
Allegia 6R Clasteron
Alpha 100
Alpha 2
Alpha 200
Alpha 2A
Alpha 2A-8000
Alpha 2A-900
Callisto Morphamax
Callisto Morphamax 500
Callisto Morphamax 5000
Callisto Morphamax 600
Callisto Morphamax 6000 SE
Callisto Morphamax 6000 SE2
Callisto Morphamax 700
Callisto Morphamax 7000
Xiph Xlater 10000
Xiph Xlater 2000
Xiph Xlater 300
Xiph Xlater 40
Xiph Xlater 5
Xiph Xlater 50
Xiph Xlater 500
Xiph Xlater 5000
Xiph Xlater 58
Run Code Online (Sandbox Code Playgroud)

  • 这应该是答案。好的! (3认同)
  • 商品订购不正确!例如,1000X 应该位于 10X 之后。 (2认同)