首页 > 解决方案 > 我们可以在对字符串数组进行排序时实现以下行为吗?

问题描述

我有一个这样的数组。

let arr = ['A1.1', 'A1.3', 'A1.2', 'A1.1 (2)', 'A1.3 (2)', 'A1.2 (2)', 'A1.1 (3)', 'A1.3 (3)', 'A1.2 (3)']

当前的排序使它像这样。我试过 sort() 方法。

let arr = ['A1.1', 'A1.1 (2)', 'A1.1 (3)', 'A1.2', 'A1.2 (2)', 'A1.2 (3)', 'A1.3', 'A1.3 (2)', 'A1.3 (3)']

我需要结果是这样的。

let arr = ['A1.1', 'A1.2', 'A1.3', 'A1.1 (2)', 'A1.2 (2)', 'A1.3 (2)', 'A1.1 (3)', 'A1.2 (3)', 'A1.3 (3)']

标签: javascriptarraysangularsorting

解决方案


一个想法是临时映射每个字符串,使括号之间的数字移动到字符串的前面,如果没有这样的部分,则将“0”放在那个位置。

Intl然后使用本机对象的功能对其应用自然排序:

function map(s) {
    // put the part in parentheses at the front of the string,
    //    defaulting to 0:
    return ("0." + s).replace(/^0(.*)\((.*)\)$/, "$2$1");
}

// Define a collator for natural sorting:
let collator = new Intl.Collator(undefined, {
    numeric: true,
    sensitivity: "base"
});

// demo
let arr = ['A1.1', 'A1.3', 'A1.2', 'A1.1 (2)', 'A1.3 (2)', 'A1.2 (2)', 'A1.1 (3)', 'A1.3 (3)', 'A1.2 (3)'];

arr.sort((a, b) => collator.compare(map(a), map(b)));

console.log(arr);


推荐阅读