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

时间:2015-09-03 10:01:41

标签: jquery json

我读到了如何使用递归技术迭代包含对象和数组的多级JSON对象。

让我们说有问题的对象如下

ng-for

使用上面的示例,如果我想将空值或空值更改为有效的字符串,是否正确的方式执行递归技术迭代JSON对象?

<childTwo *ngFor="let childOneData of data.children" [data]="childOneData "></childTwo>

我尝试了以上但没有奏效。不知道我的错误在哪里。如果可能的话,我希望上面的函数能够遍历任何级别的任何JSON对象,并且有/无对象或数组。

我在某处读到使用Underscore / Lo-dash的pick / deepClone(不确定我是否正确)使迭代(通过任何级别,以及JSON对象内的任何内部对象/数组)更容易,这是真正?

由于

2 个答案:

答案 0 :(得分:1)

您使用代码的方式正确。只需添加几件事:
- 递归函数应返回值
- Array.isArray(data[key])不是测试进一步迭代的充分方法,而是使用data[key] !== null && typeof data[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;
}

此外,您的示例data对象语法无效(缺少逗号)。

答案 1 :(得分:0)

更新了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;
}