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

如何深度反转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]
          }
        }
      )
  )
}

代码逻辑说明

  1. Object.entries(obj):将对象转换为键值对数组,便于后续操作
  2. .reverse():反转键值对数组的顺序,实现外层键的反转
  3. .map():遍历每个键值对,对值进行递归处理:
    • 若值是普通对象,递归调用reverseKeys处理嵌套对象
    • 若值是数组,遍历数组元素,仅对其中的对象或数组元素递归处理,保持数组本身的元素顺序
    • 普通值直接保留原内容
  4. Object.fromEntries():将处理后的键值对数组重新转换为对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:30:53