Javascript 在对字符串数组进行排序时,我们可以实现以下行为吗?

Javascript 在对字符串数组进行排序时,我们可以实现以下行为吗?,javascript,arrays,angular,sorting,Javascript,Arrays,Angular,Sorting,我有一个这样的数组 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)'] 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)'] 当前的排序是这样的。我尝试了sort()方法 我

我有一个这样的数组

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)']
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)']
当前的排序是这样的。我尝试了sort()方法

我需要这样的结果

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)']
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)']

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

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

功能映射{
//将该部分放在字符串前面的括号中,
//默认为0:
返回(“0.+s”)。替换(/^0(.*)\(.*)$/,“$2$1”);
}
//定义用于自然排序的排序器:
让collator=新的Intl.collator(未定义{
数字:对,
敏感度:“基础”
});
//演示
设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));

控制台日志(arr)
首先,我将使用regex解析ther
sort
中每个元素的数据,然后使用您想要分离排序逻辑的任何逻辑

例如,此正则表达式:

([A-Z])(\d+.\d)(?:\s\((\d+)\))?
将元素的每个部分分成2或3组

乙二醇

那就应用一些逻辑吧

让arr=['A1.1'、'A1.3'、'A1.2'、'A1.1(2)'、'A1.2(2)'、'A1.1(3)'、'A1.3(3)'、'A1.2(3)'
设re=/([A-Z])(\d+。\d)(?:\s\(\d+))/
const result=arr.sort((a,b)=>{
常数a匹配=a匹配(re);
常数b匹配=b匹配(re);
const suffix=parseInt(匹配[3]| |“0”,10)-parseInt(匹配[3]| |“0”,10);
如果(后缀!=0)
返回后缀
const res=parseFloat(aMatch[2])-parseFloat(bMatch[2]);
返回res;
})

控制台日志(结果)如果您的数据与提供的示例非常接近,则再举一个示例:

让arr=['A1.1'、'A1.3'、'A1.2'、'A1.1(2)'、'A1.2(2)'、'A1.1(3)'、'A1.3(3)'、'A1.2(3)'
特殊功能排序(a、b){
返回parseInt(a.replace(/[^0-9]+/g',).split(“”).reverse().join(“”)-b.replace(/[^0-9]+/g',).split(“”).reverse().join(“”);
}
f=阵列排序(特殊排序);

控制台日志(f)这是数组的实际内容,还是您将其作为一个简化示例(在有人编写soemthing来解析此数据之前,然后您说“实际上这只是一个示例,我的真实数据是XXX”),这与我的数据99%相似。我尝试过,但未能根据要求进行分组和排序。如果有一种方法可以对结果进行排序,从而得到所需的模式,那么它将有助于我的实际数据。
["A1.2 (2)", "A", "1.2", "2")
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)']

function sort_special(a, b) {
    return parseInt(a.replace(/[^0-9]+/g, '').split('').reverse().join('') - b.replace(/[^0-9]+/g, '').split('').reverse().join(''));
}
f = arr.sort(sort_special);
console.log(f);