我正在尝试编写一个函数,该函数可对对象进行挖掘,直到其到达最后一个.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;
    }

最佳答案

当下一个迭代中的内部值不是对象时,就会发生此问题。在这种情况下,您会收到一条错误消息,因为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}}}}) );

09-18 10:48