You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据值对对象中非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:22:41