递归操作javascript对象数据结束

时间:2014-04-03 00:55:55

标签: javascript json recursion

有没有办法遍历任意Javascript对象,并在其数据端更改它,而不是另一个嵌套对象?

因此,如果给出以下内容,我是否可以记录一个对象,其中' 123'' bar',' die','或'成为' xyz'?

var jso = {
    hello:[
        { foo:'bar' },
        { abc: { def:'123' } }
    ],
    world:[
        { ride:['or','die'] }
    ]
};

function recurse(object) {
    if (Object.prototype.toString.call(object) === '[object Array]') {
        var l = object.length;
        while(l--){ 
            recurse(object[l]) 
        }
    } else if(typeof object === 'object') {
        for(var key in object) {
            recurse(object[key])
        }
    } else {
        object = 'xyz';
    }
}

recurse(jso)
console.log(jso)

3 个答案:

答案 0 :(得分:3)

object = 'xyz';

这不起作用,因为它只是更改了函数调用的本地object变量。要实际修改对象,需要分配属性:

function recurse(object) {
    if(Object.prototype.toString.call(object) === '[object Array]'){
        for (var l = object.length; l--; ) { 
            if (typeof object[l] == 'object')
                recurse(object[l]);
            else
                object[l] = 'xyz';
        }
    } else {
        for(var key in object) {
            if (typeof object[key] == 'object')
                recurse(object[key]);
            else
                object[key] = 'xyz';
        }
    }
}

或(更好)

function recurse(object) {
    if (typeof object !== 'object')
        return 'xyz';

    if (Object.prototype.toString.call(object) === '[object Array]'){
        for (var l = object.length; l--; ) { 
            object[l] = recurse(object[l]);
        }
    } else {
        for (var key in object) {
            object[key] = recurse(object[key])
        }
    }
    return object;
}

答案 1 :(得分:0)

Object.keys在这些情况下很不错。

function recurse(datum) {
    if (Array.isArray(datum)) {
        datum.forEach(function (arrayItem, idx) {
            datum[idx] = recurse(datum[idx]);
        });
        return datum;
    } else if (typeof datum === 'object') {
        Object.keys(datum).forEach(function (key) {
            datum[key] = recurse(datum[key]);
        });
        return datum;
    } else {
        return 'xyz';
    }
}

JSFiddle

答案 2 :(得分:0)

简单明了:

function recurse(object) {
    Object.keys(object).forEach(function(key) {
        if (typeof object[key] == "object") {
            recurse(object[key]);
        } else {
            object[key] = "xyz";
        }
    });
}