如何根据值对对象中非date属性的属性进行排序?
问题描述
现有如下数组:
Array(7) [ { date: 'January', 'Hang with Friends': 100 }, { date: 'February', Chill: 30, Book: 80 }, { date: 'March', Yoga: 40 }, { date: 'April', Birthday: 200 }, { date: 'May', Gas: 70 }, { date: 'June', Rent: 900, testingsub: 200 }, { date: 'July', 'test sub': 500 }, ]
需求是对每个对象中**键不为date**的属性按值升序排序,最终结果如下(仅索引5的对象属性顺序变化):
Array(7) [ { date: 'January', 'Hang with Friends': 100 }, { date: 'February', Chill: 30, Book: 80 }, { date: 'March', Yoga: 40 }, { date: 'April', Birthday: 200 }, { date: 'May', Gas: 70 }, { date: 'June', testingsub: 200, Rent: 900, }, { date: 'July', 'test sub': 500 }, ]
尝试了以下代码但运行报错:
const sortedData = newData.map((item) => Object.entries(item).sort(([key1, value1], [key2, value2]) => { if (key1 !== "date" && key2 !== "date") { if (value1 > value2) { return 1; } else if (value2 > value1) { return -1; } else { return 0; } } }) );
收到的错误信息:
Argument of type '([key1, value1]: [string, number], [key2, value2]: [string, number]) => 0 | 1 | -1 | undefined' is not assignable to parameter of type '(a: [string, number], b: [string, number]) => number'. Type 'number | undefined' is not assignable to type 'number'. Type 'undefined' is not assignable to type 'number'.ts(2345)
解决方案
错误原因
你的sort回调函数存在分支未返回值的情况:当其中一个键是date时,函数没有返回任何值,导致返回undefined,而sort要求回调必须返回数值类型,因此触发TypeScript类型错误。
实现方案
可以通过两种方式实现需求,核心逻辑是:保证date始终排在对象的第一个位置,其余属性按值升序排序。
方案1:拆分属性后排序(更直观)
const sortedData = newData.map(item => { // 解构拆分出date和其他属性 const { date, ...restProps } = item; // 将其他属性转为数组后按值升序排序,再转回对象 const sortedRest = Object.fromEntries( Object.entries(restProps).sort(([, val1], [, val2]) => val1 - val2) ); // 合并date和排序后的属性,确保date在首位 return { date, ...sortedRest }; });
方案2:直接在entries排序中处理date位置
const sortedData = newData.map(item => { return Object.fromEntries( Object.entries(item).sort(([key1, val1], [key2, val2]) => { // 若其中一个是date,让date排在前面 if (key1 === 'date') return -1; if (key2 === 'date') return 1; // 非date属性按值升序排序 return val1 - val2; }) ); });
两种方案都能实现需求,处理后的数组中每个对象的date属性始终在第一位,其余属性按值从小到大排列,适配大规模数据场景。
内容的提问来源于stack exchange,提问作者Mathew
相关产品推荐
相关产品推荐

