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

如何对TypeScript Record<string, Formulaire>按date属性排序后展示?

问题描述

我有一个类型为Record<string, Formulaire>的Record数据,目前通过以下代码将其渲染为列表:

Object.keys(obj).map((id) => (
  <li> {obj[id].content} - {obj[id].date} </li>
))

但我希望列表能按date属性排序后展示。我原本以为可以直接对Record调用sort方法,写法如下:

obj.sort((a,b) => ((a.date > b.date)? 1 : -1))

然而对象并没有sort方法,请问在渲染前对该数据进行排序的最优方式是什么?

我看到过「Sort JavaScript object by key」的相关问题,但我的场景不同:我使用的是TypeScript Record,希望按关联对象的属性而非键本身排序。

解决方案

Record<string, Formulaire>本质是JavaScript对象,对象本身没有sort方法,所以得先把它转成可排序的数组,再按date属性排序后渲染,具体实现如下:

最优实现(保留原ID作为React key)

用Object.entries()把Record转成[键, 值]格式的数组,这样既能保留原有的ID,又能拿到对应的Formulaire对象,排序后直接渲染即可:

Object.entries(obj)
  // 按date排序,若date是字符串需转成Date对象避免排序误差
  .sort(([, itemA], [, itemB]) => {
    const dateA = new Date(itemA.date);
    const dateB = new Date(itemB.date);
    return dateA.getTime() - dateB.getTime();
    // 若date是数字类型的时间戳,直接相减即可:return itemA.date - itemB.date;
  })
  .map(([id, item]) => (
    <li key={id}> {item.content} - {item.date} </li>
  ))

简化实现(无需保留原ID)

如果渲染时不需要用到原Record的键(ID),可以用Object.values()直接提取所有Formulaire对象组成数组排序,注意用索引作为key仅适合静态排序后的列表:

Object.values(obj)
  .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime())
  .map((item, index) => (
    <li key={index}> {item.content} - {item.date} </li>
  ))

内容的提问来源于stack exchange,提问作者AntoninL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:35:01