对象数组按多规则排序输出异常:仅显示一次问题求助
解决对象数组多维度排序展示的问题
我来帮你分析问题出在哪,然后给出能实现你需求的修复方案:
核心问题分析
- 数组
sort是原地修改:你当前的printObject函数直接对传入的allNames调用sort,这个方法会直接改变原数组的顺序。如果多次调用排序逻辑,后面的排序都是基于前一次修改后的数组,而非原始数据。 - 仅调用了一次打印函数:你的
main函数里只执行了一次printObject,自然只会输出一组排序结果。 - 缺少按索引排序的处理:按索引排序其实就是原始数组的默认顺序,不需要额外排序操作,直接使用原始数组的副本即可。
修复后的完整代码
class Names { constructor(first, last, age) { this.first = first; this.last = last; this.age = age; } } function printObject(allNames, sortType, message) { // 每次排序前先创建数组副本,避免修改原始数组 const sortedNames = [...allNames]; if (sortType === "first") { sortedNames.sort((a, b) => a.first.localeCompare(b.first)); } else if (sortType === "last") { sortedNames.sort((a, b) => a.last.localeCompare(b.last)); } else if (sortType === "age") { sortedNames.sort((a, b) => a.age - b.age); } // sortType为"index"时,直接用副本(即原始顺序) console.log(`--- ${message} ---`); for (let i = 0; i < sortedNames.length; i++) { console.log(`${sortedNames[i].first} ${sortedNames[i].last} ${sortedNames[i].age}`); } } // main function function main() { const allNames = []; allNames.push(new Names("John", "Doe", 40)); allNames.push(new Names("Jay", "Thrift", 30)); allNames.push(new Names("Card", "Ace", 20)); // 按原始索引顺序展示 printObject(allNames, "index", "按索引排序"); // 按first name排序展示 printObject(allNames, "first", "按First Name排序"); // 按last name排序展示 printObject(allNames, "last", "按Last Name排序"); // 按age排序展示 printObject(allNames, "age", "按年龄排序"); } main();
关键改动说明
- 创建数组副本:用
const sortedNames = [...allNames]复制原始数组,确保每次排序操作都不会破坏原始数据,保证所有排序逻辑都基于最初的对象数组。 - 优化条件判断:把多个独立
if改成else if,减少不必要的判断逻辑,代码更简洁。 - 增加多次调用:在
main函数里分别调用四次printObject,对应四种排序需求,每次传入不同的sortType和提示信息。 - 优化输出格式:添加分隔线让每组结果边界更清晰,阅读起来更直观。
运行后输出示例
--- 按索引排序 --- John Doe 40 Jay Thrift 30 Card Ace 20 --- 按First Name排序 --- Card Ace 20 Jay Thrift 30 John Doe 40 --- 按Last Name排序 --- Card Ace 20 John Doe 40 Jay Thrift 30 --- 按年龄排序 --- Card Ace 20 Jay Thrift 30 John Doe 40
内容的提问来源于stack exchange,提问作者gury1993
相关产品推荐
相关产品推荐

