如何按月份键对以月份为键的支出数组进行完整排序?
按月份顺序排序键值对对象的解决方案
首先要澄清一点:你示例里的[May: 629, April: 300, March: 50]其实是JavaScript的对象(Object)(正确写法应为{May: 629, April: 300, March: 50}),而非数组——数组是按索引存储的有序集合,键值对结构属于对象范畴。
你已经走对了第一步:通过标准月份顺序数组来排序对象的键,接下来只需要基于排序后的键,构建一个有序的结果结构即可。由于早期JavaScript对象不保证键的顺序(ES6+虽对字符串键有插入顺序保障,但数组的顺序是绝对可靠的),这里提供两种实用方案:
方案1:转换成有序的键值对数组(推荐,顺序绝对可靠)
这种方式将对象转为数组形式,既保留键值关系,又能严格保证顺序,适合需要按顺序渲染、计算的场景:
// 原始支出对象 const expenseObj = { May: 629, April: 300, March: 50 }; // 标准月份顺序参照数组 const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; // 获取排序后的月份键数组 const sortedKeys = Object.keys(expenseObj).sort((a, b) => months.indexOf(a) - months.indexOf(b)); // 转换成嵌套对象形式的有序数组 const sortedExpenses = sortedKeys.map(key => ({ [key]: expenseObj[key] })); console.log(sortedExpenses); // 输出: [ { March: 50 }, { April: 300 }, { May: 629 } ] // 或者更简洁的[月份, 支出]数组形式 const sortedExpensesSimple = sortedKeys.map(key => [key, expenseObj[key]]); console.log(sortedExpensesSimple); // 输出: [ ["March", 50], ["April", 300], ["May", 629] ]
方案2:创建新的有序对象(ES6+环境适用)
如果你仍需要对象结构,ES6及以上版本的JavaScript会保留字符串键的插入顺序,可基于排序后的键重新构建对象:
// 原始支出对象 const expenseObj = { May: 629, April: 300, March: 50 }; // 标准月份顺序参照数组 const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; // 获取排序后的月份键数组 const sortedKeys = Object.keys(expenseObj).sort((a, b) => months.indexOf(a) - months.indexOf(b)); // 构建有序对象 const sortedExpenseObj = {}; sortedKeys.forEach(key => { sortedExpenseObj[key] = expenseObj[key]; }); console.log(sortedExpenseObj); // 输出: { March: 50, April: 300, May: 629 }
简单总结:如果业务场景需要严格保证顺序(比如渲染列表、按顺序统计),优先选择数组形式的方案;若仅需对象结构且运行环境支持ES6+,方案2即可满足需求。
内容的提问来源于stack exchange,提问作者Sujan Shrestha
相关产品推荐
相关产品推荐

