Jquery 用于在JSON对象中循环的递归函数

Jquery 用于在JSON对象中循环的递归函数,jquery,json,Jquery,Json,我阅读了关于如何使用递归技术迭代包含对象和数组的多层JSON对象的内容 假设所讨论的对象如下 { "data":[ { "Name": "Name1", "Id": "Id1", "Prop": { "isProp":"" "isClass":"Yes" } }, {

我阅读了关于如何使用递归技术迭代包含对象和数组的多层JSON对象的内容

假设所讨论的对象如下

{
    "data":[
        {
            "Name": "Name1",
            "Id": "Id1",
            "Prop": {
                "isProp":""
                "isClass":"Yes"
            }
        },
        {
            "Name": "Name2",
            "Id": "Id2",
            "Prop": {
                "isProp":"No"
                "isClass":"Yes"
            }
        },
        {
            "Name": "Name3",
            "Id": "Id3",
            "Prop": [
                {
                    "isProp":"Maybe"
                    "isClass":""
                },
                {
                    "isProp":"No"
                    "isClass": null
                },
            ]
        }
    ]
}
以上面的例子为例,如果我想将空值或null值更改为有效字符串,那么执行递归技术来迭代JSON对象的正确方法是什么

$.ajax(somethingHere).success(function(data){
    !(Array.isArray(data)) ? iterateObj(data) : $.each(data, function(){ iterateObj(this) });
});

function iterateObj(data){
    for(var key in data){
        if (data.hasOwnProperty(key)){
            if (!(Array.isArray(data[key]))){
                if (!data[key]){
                    data[key] = "Empty";
                }
            }
            else {
                $.each(data, function(){ iterateObj(this) })
            }
        }
    }
}
我尝试了上述方法,但没有成功。不知道我的错在哪里。如果可能的话,我希望上面的函数能够遍历任何级别的JSON对象,其中包含/不包含对象或数组

我在某个地方读到,使用下划线/lodash的pick/deepClone(不确定是否正确)使迭代(通过任何级别,以及JSON对象内部的任何内部对象/数组)变得更容易,这是真的吗


谢谢

您使用代码的方法是正确的。只有几件事需要补充:
-递归函数应返回值
-
Array.isArray(data[key])
不是测试进一步迭代的充分方法,请使用
data[key]!=null&&typeof数据[key]=='object'
代替

因此,您的函数可能如下所示:

$.ajax(somethingHere).success(function(data){
    data = iterateObj(data);
});

function iterateObj(data) {
    for(var key in data){
        if (data.hasOwnProperty(key)) {
            if (data[key] !== null && typeof data[key] === 'object') {
                data[key] = iterateObj(data[key]);
            }
            else {
                if ( ! data[key]){
                    data[key] = "Empty";
                }
            }
        }
    }
    return data;
}
另外,示例
数据
对象的语法无效(缺少逗号)。

更新了
iterateObj()
函数以处理其他数据类型

function iterateObj(dupeObj) {
    var retObj = new Object();
    if (typeof (dupeObj) == 'object') {
        if (typeof (dupeObj.length) == 'number')
            var retObj = new Array();

        for (var objInd in dupeObj) {
            if (dupeObj[objInd] == null)
                dupeObj[objInd] = "Empty";
            if (typeof (dupeObj[objInd]) == 'object') {
                retObj[objInd] = iterateObj(dupeObj[objInd]);
            } else if (typeof (dupeObj[objInd]) == 'string') {
                retObj[objInd] = dupeObj[objInd];
            } else if (typeof (dupeObj[objInd]) == 'number') {
                retObj[objInd] = dupeObj[objInd];
            } else if (typeof (dupeObj[objInd]) == 'boolean') {
                ((dupeObj[objInd] == true) ? retObj[objInd] = true : retObj[objInd] = false);
            }       
        }
    }
    return retObj;
}

尝试在不使用ajax调用的情况下,使用固定的json格式(如图所示)对此进行修改。您可能会想到下划线.js,它允许在不破坏Javascript堆栈的情况下执行任意级别的递归。我不确定是否需要检查其他数据类型(对象和数组除外,可能还有布尔值),由于我只想将任何空数据(empty、NaN、undefined、null、0、false..)更改为“empty”,所以我不太明白您要验证的键是对象还是数组。如果这部分是真的,那么如果被迭代的键实际上是一个数组,它不会跳过迭代吗?数组也是对象,所以它不会跳过。由于null在Javascript中也被视为对象,因此我还要检查变量是否为null。