Javascript 如何递归处理JSON数据并从函数返回处理后的JSON?

Javascript 如何递归处理JSON数据并从函数返回处理后的JSON?,javascript,json,recursion,Javascript,Json,Recursion,下面是包含嵌套对象的JSON数据。我想从这个结构中删除'id',并从函数中返回更改后的JSON。我尝试以下面的方式递归地执行此操作,但无法返回更改后的JSON var jsonStr = {"_id":"7r0c0342e", "user":"myuser", "project":"abcd", "info":{"DOMAIN":{"Department":{"profile":[{"workex":8,"name":"alex","id":82838}, {"workex":8,"name"

下面是包含嵌套对象的JSON数据。我想从这个结构中删除'id',并从函数中返回更改后的JSON。我尝试以下面的方式递归地执行此操作,但无法返回更改后的JSON

var jsonStr = 
{"_id":"7r0c0342e",
"user":"myuser",
"project":"abcd",
"info":{"DOMAIN":{"Department":{"profile":[{"workex":8,"name":"alex","id":82838},
{"workex":8,"name":"smith","id":84838} ]}}} };


processJSON(jsonStr);

function processJSON(jsondata) {
    for (var i in jsondata) {
        var row = jsondata[i];           
        if(typeof row == "object") {
            processJSON(row);              
        } else if(typeof row == 'number') {
            if(i == 'id') {
                delete jsondata[i];                    
            } else {                
                continue;
            }
        } else {
            continue;
        }              
      }   
}

console.log(jsonStr);
如何从processJSON()返回JSON的其余部分并将其保存在变量中?其次,这是递归的正确方法吗


谢谢。

使用您的方法,您可以改变原始对象,因此在某种程度上,您不必返回任何内容

如果要保留原始对象并返回更改的副本,则首先需要创建对象的副本,并在该副本上运行算法。您可以创建对象的浅层副本,例如使用
对象。分配

var-jsonStr={{{id:“7r0c0342e”,“user:“myuser”,“project:“数据挖掘”,“info:{”DOMAIN:{”Department:{”profile:[{{“workex”:8,“name:“name:”alex”,“id:”82838},{“workex”:8,“name:”smith,“id:”84838}}};
log(processJSON(jsonStr));
函数processJSON(jsondata){
var output=Object.assign({},jsondata)
用于(输出中的var i){
var行=输出[i];
如果(行的类型==“对象”){
输出[i]=processJSON(行);
}else if(行的类型='number'){
如果(i='id'){
删除输出[i];
}否则{
继续;
}
}否则{
继续;
}
}
返回输出;
}
var jsonStr=
{
“_id”:“7r0c0342e”,
“用户”:“我的用户”,
“项目”:“数据挖掘”,
“信息”:{
“域”:{
“部门”:{
“profile”:[{“workex”:8,“name”:“alex”,“id”:82838},
{“workex”:8,“name”:“smith”,“id”:84838}]
}
}
}
};
让modifedJson=JSON.parse(JSON.stringify(jsonStr));
parseJson=函数(json){
for(让我们输入json){
如果(键=='id'){
删除json[key];
}
else if(json[key]='object'的类型){
parseJson(json[key])
}
}
}
parseJson(modifedJson)
console.log('modified',modifiedjson)
log('original',jsonStr)
这里有一个解决方案,使用它可以就地修改数据

//const objectScan=require('object-scan');
const jsonStr={{u id:'7r0c0342e',用户:'myuser',项目:'abcd',信息:{DOMAIN:{Department:{profile:[{workex:8,name:'alex',id:82838},{workex:8,name:'smith',id:84838}}};
常量prune=(obj)=>objectScan(['**.id']{
rtn:'计数',
filterFn:({parent,property})=>{
删除父项[属性];
返回true;
}
})(obj);
console.log(prune(jsonStr));//返回删除的数量
// => 2
console.log(jsonStr);
//=>{u id:'7r0c0342e',用户:'myuser',项目:'abcd',信息:{域:{部门:{档案:[{workex:8,名称:'alex'},{workex:8,名称:'smith'}}}
。作为控制台包装{最大高度:100%!重要;顶部:0}

这不是json字符串(对变量有误导性的名称)。您实际上没有在该函数中返回任何内容,也没有对原始json对象进行修改。所以实际上它什么也没做。还有,易卜拉欣所说的^^^该死,你把我揍了一顿,我写了一个非常相似的答案!此外,我认为库中的一些筛选选项(如下划线)将有助于使代码更简洁易读。这并不能修复深度嵌套的ID,他的问题暗示他也在试图删除这些ID。@Paul你说得绝对正确。编辑我的答案来解决这个问题。