挖到最深的.value或.content

时间:2015-03-22 20:17:09

标签: javascript

我正在尝试编写一个挖掘对象的函数,直到它到达最后.value.content属性。我写了这个,为了我的生活,我无法弄清楚它为什么会破裂。

    var jscGetDeepest = function(obj) {
        try {
            console.info(Math.round(Math.random() * 10) + ' starting jscGetDeepest:', obj, obj.toString());
        } catch(ignore) {}

        while (obj && ('contents' in obj || 'value' in obj)) {
            if ('contents' in obj) {
                obj = obj.contents;
            } else if ('value' in obj) {
                obj = obj.value;
            }
            //console.info('loop jscGetDeepest:', obj.toString());
        }

        if (obj || obj === 0) {
            obj = obj.toString();
        }
        console.info('finaled jscGetDeepest:', obj);
        return obj;
    }

1 个答案:

答案 0 :(得分:1)

当下一次迭代中的内部值不是对象时,会出现问题。在这种情况下,您会收到一条错误消息,因为in操作数不能与基元一起使用。

要修复它,请在尝试深入之前检查对象。以下是使用JSON.stringify而不是toString修复稍微改进的版本(可能更好地返回对象而不进行字符串化?):

var jscGetDeepest = function (obj) {

    while (typeof obj === 'object' && obj !== null && ('contents' in obj || 'value' in obj)) {
        if ('contents' in obj) {
            obj = obj.contents;
        } else if ('value' in obj) {
            obj = obj.value;
        }
    }

    if (typeof obj === 'object') {
        obj = JSON.stringify(obj);
    }
    
    return obj;
}

alert( jscGetDeepest({value: {name: 2, contents: {name: 3, value: 23}}}) );
alert( jscGetDeepest({value: {name: 2, value: {name: 3, contents: {name: 4}}}}) );