js 递归修改json的key键(30元钱)

var dataObject = {
        "1": {
            "name": "第一级1",
            "type": "第一级2",
            "describe": "第一级3",
            "testNum": "第一级4",
            "1-1": {
                "name": "第二级5",
                "type": "第二级6",
                "describe": "第二级7",
                "testNum": "第二级8",
                "1-1-1": {
                    "name": "第三级9",
                    "type": "第三级q",
                    "describe": "第三级w",
                    "testNum": "第三级e"
                },
                "1-1-2": {
                    "name": "第三级r",
                    "type": "第三级ty",
                    "describe": "第三级y",
                    "testNum": "第三级y"
                }
            }
        },
        "2": {
            "name": "第一级6",
            "type": "第一级d",
            "describe": "第一级f",
            "testNum": "第一级g"
        }
    };

将里面的1-1,1-1-1,1-2之类的值修改成对应的name字段里面的值,需要替换成下面这种的:

    var dataObject = {
        "第一级1": {
            "name": "第一级1",
            "type": "第一级2",
            "describe": "第一级3",
            "testNum": "第一级4",
            "第二级5": {
                "name": "第二级5",
                "type": "第二级6",
                "describe": "第二级7",
                "testNum": "第二级8",
                "第三级9": {
                    "name": "第三级9",
                    "type": "第三级q",
                    "describe": "第三级w",
                    "testNum": "第三级e"
                },
                "第三级r": {
                    "name": "第三级r",
                    "type": "第三级ty",
                    "describe": "第三级y",
                    "testNum": "第三级y"
                }
            }
        },
        "第一级6": {
            "name": "第一级6",
            "type": "第一级d",
            "describe": "第一级f",
            "testNum": "第一级g"
        }
    };

树形结构总共有三层,可能会有很多数据,规律就是这样,试了好久的递归,找不出解答方法,烦死了

阅读 5k
6 个回答
function transform(obj) {
            if(typeof(obj)==='object'){
                Object.keys(obj).forEach(
                    key=>{
                        if(typeof (obj[key])==='object'&&obj[key]['name']){
                            obj[obj[key]['name']]=obj[key];
                            obj[obj[key]['name']]=transform(obj[obj[key]['name']]);
                        }
                    }
                )
                Object.keys(obj).forEach(
                    key=>{
                        if(typeof (obj[key])==='object'&&obj[key]['name']&&key!==obj[key]['name']){
                            delete(obj[key]);
                        }
                    }
                )
            }
            return obj;
        }

已测试,ok

可以用replace, JSON.stringify(dataObject).replace(/"1-"/, "第二级")

var dataObject = {
    "1": {
        "name": "第一级1",
        "type": "第一级2",
        "describe": "第一级3",
        "testNum": "第一级4",
        "1-1": {
            "name": "第二级5",
            "type": "第二级6",
            "describe": "第二级7",
            "testNum": "第二级8",
            "1-1-1": {
                "name": "第三级9",
                "type": "第三级q",
                "describe": "第三级w",
                "testNum": "第三级e"
            },
            "1-1-2": {
                "name": "第三级r",
                "type": "第三级ty",
                "describe": "第三级y",
                "testNum": "第三级y"
            }
        }
    },
    "2": {
        "name": "第一级6",
        "type": "第一级d",
        "describe": "第一级f",
        "testNum": "第一级g"
    }
};
var deepReplaceKey = function(obj) {
    if (typeof obj === 'object') {
        for (var key in obj) {
            var value = obj[key];
            if (typeof value === 'object') {
                var name = value.name;
                obj[name] = value;
                delete obj[key];
                deepReplaceKey(value);
            }
        }
    }
    return obj;
};
console.log(deepReplaceKey(dataObject));
const reduce = (src, dist) => Object.keys(src).reduce(walker(src), dist)
const walker = obj => (p, key) => [
    typeof obj[key] !== 'object'
        ? p[key] = obj[key] 
        : (name => [p[name] = {}, reduce(obj[key], p[name])])(obj[key].name), p][1]
        
const result = {}
reduce(dataObject, result)
console.dir(result)
function generate(obj) {
  let _obj = {}
  Object.entries(obj).forEach(([key, value]) => {
    if (typeof value !== 'object') {
      _obj[key] = value
    } else {
      _obj[value.name] = generate(value)
    }
  })
  return _obj
}

看着像钢琴谱

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题