如何按对象name属性中#后的数字对对象数组排序
实现方案
核心是在数组的sort方法的比较函数中,提取每个对象name字段中#后的数字,再按数字大小比较即可。
基础实现代码
const question = [{name:"Question 1 #1", content:"blabla?"}, {name:"Question 1 #3", content:"blabla?"}, {name:"Question 1 #4", content:"blabla?"}, {name:"Question 1 #2", content:"blabla?"}]; const sortedQuestion = question.sort((a, b) => { // 提取name中#后的数字并转成数值类型 const numA = Number(a.name.split('#')[1]); const numB = Number(b.name.split('#')[1]); // 按数字升序排序,需要降序的话改成 return numB - numA 即可 return numA - numB; }); console.log(sortedQuestion);
注意事项
- 用
split('#')切割字符串的方案默认name中只有一个#,如果你的场景中可能存在多个#,可以用正则匹配提取,鲁棒性更强:// 匹配字符串中第一个#后面的连续数字 const getOrderNum = (str) => Number(str.match(/#(\d+)/)[1]); const sortedQuestion = question.sort((a, b) => getOrderNum(a.name) - getOrderNum(b.name)); sort方法默认会修改原数组,如果需要保留原始数组,可以先做浅拷贝再排序:const sortedQuestion = [...question].sort((a, b) => Number(a.name.split('#')[1]) - Number(b.name.split('#')[1]));
内容的提问来源于stack exchange,提问作者Haine Thomas
相关产品推荐
相关产品推荐

