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

JavaScript嵌套对象键值互换及输出JSON字符串的实现问题

你写的swap函数仅支持单层键值对互换,没有适配嵌套对象、数组等复杂结构,所以无法处理你给出的多层级数据结构。

实现思路

要实现深层的键值互换,需要做递归遍历,针对不同数据类型做对应处理:

  • 遇到数组就遍历每一项递归处理
  • 遇到普通对象就遍历键值对:值为字符串、数字等原始类型就直接互换,值为对象/数组等复杂类型就递归处理后保留原键
  • 可按需处理空值、重复值等边界情况(重复值作为键时后出现的会覆盖先出现的)

实现代码

function deepSwapKeyVal(input) {
  // 处理对象类型
  if (typeof input === 'object' && input !== null) {
    // 数组类型:遍历每个元素递归处理
    if (Array.isArray(input)) {
      return input.map(item => deepSwapKeyVal(item))
    }
    // 普通对象类型:遍历键值对
    const swapped = {}
    for (const [key, value] of Object.entries(input)) {
      // 值为原始类型,直接互换键值
      if (typeof value !== 'object' || value === null) {
        // 可根据需求删除以下判断,保留空字符串对应的键值对
        if (value !== '') {
          swapped[value] = key
        }
      } else {
        // 值为复杂类型,保留原键,值替换为递归互换后的结果
        swapped[key] = deepSwapKeyVal(value)
      }
    }
    return swapped
  }
  // 非对象类型直接返回
  return input
}

// 调用:data为你给出的原始对象
const result = deepSwapKeyVal(data)
// 输出格式化的JSON字符串
console.log(JSON.stringify(result, null, 2))

效果示例

处理后的第一个image节点完全符合你的预期:

{
  "ASDV1-01.jpg": "key",
  "image1.jpg": "image_location",
  "data": {
    "CE44DBAC-59B2-4178-8392-0141FB2F58DF": "documentid",
    "Feb  1 2018 12:05PM": "scandate",
    "1": "F08",
    "101076": "F10"
  },
  "crops": {
    "F08": {
      "rectangle": {
        "690": "left",
        "2111": "top",
        "597": "width",
        "121": "height"
      }
    },
    "F09": {},
    "F10": {
      "rectangle": {
        "653": "left",
        "821": "top",
        "653": "width",
        "243": "height"
      }
    },
    "F11": {}
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:54:05