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

