为何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
相关产品推荐
相关产品推荐

