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

为何sortWeekFunction可按数组顺序排序对象?代码原理解析

拆解sortWeekFunction的排序逻辑

这个函数的核心作用就是按照指定数组的顺序,重新排列对象的键值对,下面一步步拆解每一行的作用:

1. 将输入对象转为Map结构

const newMapSortObj = new Map(Object.entries(object));
  • Object.entries(object) 会把输入的对象(比如weeksObj)转换成键值对数组,格式是 [['键1', '值1'], ['键2', '值2'], ...],对应到例子里就是 [['wednesday','wednesday'], ['friday','friday'], ['monday','monday'], ['thursday','thursday'], ['sunday','sunday']]。
  • 接着用new Map()把这个数组包装成Map对象,Map会保留键值对的插入顺序(不过在ES6+中普通对象的字符串键也会保留插入顺序,这一步更多是代码习惯,其实可以直接用Object.entries的结果继续操作)。

2. 按指定数组的顺序排序键值对

const sortObj = Array.from(newMapSortObj)?.sort(
  (a, b) => array.indexOf(a[0]) - array.indexOf(b[0])
);
  • Array.from(newMapSortObj) 把Map对象再转回键值对数组,和Object.entries的结果结构完全一致。
  • 重点是sort方法的比较函数:
    • 每一个排序项a和b都是键值对数组,a[0]就是对象的键(比如'wednesday')。
    • array.indexOf(a[0]) 会获取这个键在指定顺序数组(weeksArr)中的位置索引:比如sunday在weeksArr里是第0位,monday是第1位,wednesday是第2位,以此类推。
    • 用a的索引减去b的索引:如果结果为负,a就排在b前面;结果为正,b排在a前面;为0则顺序不变。这就实现了完全按照指定数组的顺序来排序键值对。

3. 将排序后的数组转回对象

return Object.fromEntries(sortObj);

Object.fromEntries() 会把排序后的键值对数组重新转换成对象,最终输出的就是按照weeksArr顺序排列的对象,也就是你看到的输出结果。

补充说明

其实这段代码可以简化,跳过转Map的步骤,直接用Object.entries处理:

const sortWeekFunction = (array, object) => {
  return Object.fromEntries(
    Object.entries(object).sort((a, b) => array.indexOf(a[0]) - array.indexOf(b[0]))
  );
};

效果和原代码完全一致,转Map的步骤在这里没有实际必要,可能是开发者的个人习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:25