如何对含字母数字的Object数组按指定size规则排序
解决方案:按指定规则排序含混合字母数字的size字段
思路分析
要实现你想要的排序效果,核心是分两步处理:
- 先给
SHORT、REG、LONG三个后缀定义优先级,确保分组顺序符合要求 - 同一后缀组内,把size里的数字转为整数,按数值升序排列
完整代码实现
var data = [ {size: "40 SHORT", avail: true}, {size: "46 LONG", avail: true}, {size: "42 SHORT", avail: true}, {size: "40 REG", avail: true}, {size: "42 LONG", avail: true}, {size: "42 REG", avail: true}, {size: "44 REG", avail: true}, {size: "44 LONG", avail: true}, {size: "46 REG", avail: true}, {size: "48 REG", avail: true}, {size: "44 SHORT", avail: true}, {size: "38 REG", avail: true}, {size: "40 LONG", avail: true}, {size: "48 LONG", avail: true}, {size: "38 SHORT", avail: true} ]; // 定义后缀优先级:SHORT排最前,其次是REG,最后是LONG const suffixPriority = { SHORT: 0, REG: 1, LONG: 2 }; // 执行排序 data.sort((itemA, itemB) => { // 拆分size字段为数字字符串和后缀部分 const [numStrA, suffixA] = itemA.size.split(' '); const [numStrB, suffixB] = itemB.size.split(' '); // 先按后缀优先级排序 if (suffixPriority[suffixA] !== suffixPriority[suffixB]) { return suffixPriority[suffixA] - suffixPriority[suffixB]; } // 后缀相同则按数字升序排列(转整数避免字符串排序的坑) return parseInt(numStrA, 10) - parseInt(numStrB, 10); }); // 此时data即为你期望的排序结果 console.log(data);
代码细节说明
- 后缀优先级映射:用对象给每个后缀分配数字值,排序时通过数值差快速确定顺序,保证SHORT→REG→LONG的分组逻辑。
- 拆分size字段:通过
split(' ')把"数字 后缀"格式的字符串拆分开,方便分别处理排序条件。 - 数字转整数:如果直接用字符串比较数字,会出现"100"排在"9"前面的错误,转成整数后才是真正的数值升序。
运行这段代码后,data数组就会完全匹配你给出的期望输出顺序。
内容的提问来源于stack exchange,提问作者Vinod Kumar
相关产品推荐
相关产品推荐

