如何对含字母数字的对象数组进行字母与数字双维度降序排序?
解决对象数组按字母数字混合降序排序的问题
嘿,我懂你遇到的问题啦!你直接把collator.compare传给数组的sort方法无效,是因为sort默认会拿数组里的整个对象去比较,但collator.compare是用来对比字符串的——它根本不知道要去读取对象里的map_name属性呀!
正确的实现方式
你需要自己写一个排序回调函数,在函数里提取每个对象的map_name字段,再用collator.compare去对比这些字段值;如果要降序排序,只需要把对比的两个值顺序反过来就行。
完整代码示例:
// 你的原始数据 const data = [ {"map_name": "PHX7260.AE5020003.9"}, {"map_name": "PHX7260.AE5020003.10"}, {"map_name": "PHX7260.AE5020003.1"} ]; // 创建数字敏感的排序器 const collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'}); // 排序:创建原数组副本避免修改原数据,同时实现降序 const sortedData = [...data].sort((objA, objB) => { // 用b的map_name和a的对比,实现降序 return collator.compare(objB.map_name, objA.map_name); }); console.log(sortedData);
输出结果
运行后你会得到按字母数字混合降序排列的对象数组:
[ {"map_name": "PHX7260.AE5020003.10"}, {"map_name": "PHX7260.AE5020003.9"}, {"map_name": "PHX7260.AE5020003.1"} ]
小细节说明
- 用
[...data]创建原数组的副本再排序,是为了不修改原始数据;如果你的业务允许修改原数组,直接用data.sort(...)也可以。 collator的配置numeric: true已经帮你处理了数字部分的排序(比如让10排在9后面,而不是按字符串顺序把10排在1后面),非常适合这种字母数字混合的场景。
内容的提问来源于stack exchange,提问作者shweta
相关产品推荐
相关产品推荐

