React.js中如何对Object.keys获取的数组按日期(最新/最旧)排序
实现方法
普通对象本身不具备数组的sort方法,你之前无法直接调用myObj.sort的核心原因就是结构不匹配,只需要把现有对象转换为标准数组,再叠加日期比较逻辑即可完成排序,具体操作如下:
第一步:把对象转为可排序的数组
你当前的myObj是键为数字索引、值为业务数据对象的结构,不需要手动遍历Object.keys取值,直接用Object.values()就能一次性拿到所有业务对象组成的标准数组,替代你之前手动索引取值的写法:
const dataSource = Object.values(myObj)
第二步:编写日期排序逻辑
你存储的日期字段是YYYY-MM-DD HH:mm:ss的统一格式,这种格式的字符串字典排序顺序和真实时间顺序完全一致,不需要强制转换为时间戳即可直接比较;如果要兼容日期格式不统一的边缘场景,也可以转为毫秒时间戳做比较,稳定性更强。
- 按*日期从最新到最旧(降序)*排序的实现:
// 方式1:统一格式下直接用字符串本地比较,性能更好 dataSource.sort((a, b) => b.date.localeCompare(a.date)) // 方式2:转成时间戳比较,对格式兼容性更强 dataSource.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime())
- 按*日期从最旧到最新(升序)*排序的实现:只需要调整比较逻辑里a、b的位置即可
dataSource.sort((a, b) => a.date.localeCompare(b.date))
注意事项
- JS原生的
sort()是原地排序,会直接修改调用方法的数组,如果需要保留原数据的原始顺序,记得先做浅拷贝再执行排序:
// 浅拷贝后再排序,不改动原始数据 const sortedList = [...Object.values(myObj)].sort(/* 替换为你的排序逻辑 */)
- 如果排序后还需要保留原对象的键值映射(比如要获取每个数据对应的原始对象索引),可以在转数组时把键值一并存入数组项:
const dataSource = Object.keys(myObj).map(objKey => ({ originalKey: objKey, ...myObj[objKey] }))
- 排序完成后,不需要再通过
Object.keys(myObj)索引取值,直接遍历排好序的数组就能拿到对应的id、name等字段,和你之前的取数逻辑完全兼容:
sortedList.forEach(item => { console.log(item.id, item.name, item.date) })
内容的提问来源于stack exchange,提问作者Isaque Palmieri
相关产品推荐
相关产品推荐

