如何深度反转JavaScript对象的键顺序
深度反转JavaScript对象所有键的顺序
需求:实现一个函数,深度反转JavaScript对象中所有层级的键的顺序,嵌套对象内部的键同样需要反转。
示例
输入对象:
{ a: 'val1', b: 'val2', c: { ca: 'val3', cb: 'val4' } }
转换后输出:
{ c: { cb: 'val4', ca: 'val3' }, b: 'val2', a: 'val1' }
原代码问题分析
你编写的递归函数存在逻辑错误:当处理嵌套对象时,直接将newObj替换为嵌套对象反转后的结果,这会覆盖之前已经处理好的外层键值对,最终导致函数返回的结果只保留了最后一个处理的嵌套对象内容,丢失了外层的其他键值对。
原错误代码:
function reverseKeys (obj, newObj = {}) { Object.keys(obj).reverse().forEach(key => { if(typeof obj[key] === 'object') { newObj = reverseKeys(obj[key], {}) } newObj[key] = obj[key] }) return newObj }
修正后的解决方案
基于思路优化后的函数,能够正确处理所有层级的对象,同时兼容数组类型(仅递归处理数组内的对象/数组元素,保持数组本身的元素顺序):
function reverseKeys (obj) { return Object.fromEntries( Object.entries(obj) .reverse() .map( ([k, v]) => { // 处理普通对象(排除数组和null) if (v.constructor === Object && v.constructor !== Array && v !== null) { return [k, reverseKeys(v)] } // 处理数组,递归处理数组内的对象/数组元素 else if (v.constructor === Array && v !== null) { const a = [] v.forEach(elem => { if ((elem.constructor === Object || elem.constructor === Array) && elem !== null) { a.push(reverseKeys(elem)) } else { a.push(elem) } }) return [k, a] } // 普通值直接返回 else { return [k, v] } } ) ) }
代码逻辑说明
Object.entries(obj):将对象转换为键值对数组,便于后续操作.reverse():反转键值对数组的顺序,实现外层键的反转.map():遍历每个键值对,对值进行递归处理:- 若值是普通对象,递归调用
reverseKeys处理嵌套对象 - 若值是数组,遍历数组元素,仅对其中的对象或数组元素递归处理,保持数组本身的元素顺序
- 普通值直接保留原内容
- 若值是普通对象,递归调用
Object.fromEntries():将处理后的键值对数组重新转换为对象
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

