将字符串表示法转换为递归对象指针

时间:2012-09-22 14:49:19

标签: javascript object for-loop error-handling

我想要将符号(例如'main:message:new')转换为引用的对象属性(resource [main] [message] [new])。

var notation = 'main:message:new';

var ressource = {
    message: { new: 'something' }
};

var splitKeys = function(keys, object) {
    var keys, pointer;
    pointer = object;
    keys = keys.split(':');
    for (i = 0; i < keys.length; i++) {
        // here is the error
        if (pointer[keys[i]] === undefined) break;
        pointer = pointer[keys[i]];
    }
    return pointer;
};

console.log(splitKeys(notation, ressource));

如您所见,我遇到了错误处理方面的问题。如果存在与具体资源不匹配的资源符号,我想不返回任何内容。不幸的是,我总是得到一个错误抛出'无法读取属性undefined of undefined'...

2 个答案:

答案 0 :(得分:2)

第一个属性名称main在资源对象中不存在,因此您的方法将始终返回整个对象而不是您要瞄准的属性值,即{ new: 'something' }

var splitKeys = function(keys, object) {
    var pointer = object;
    var parent = pointer;
    keys = keys.split(':').slice(1); // exclude `main`
    for (var i = 0; i < keys.length; i++) {
        if (pointer[keys[i]] === undefined) break;
        parent = pointer;
        pointer = pointer[keys[i]];
    }
    return parent;
};

这将返回new对象,即{ new: 'something' }。如果您想要返回属性值,请返回pointer而不是parent

<强> DEMO

答案 1 :(得分:0)

您的代码不会出现任何错误,因此可能还有其他问题。

但如果您想在资源不匹配时不返回任何内容,则应使用return代替break

var notation = 'main:message:new';

var ressource = {
    message: { new: 'something' }
};

var splitKeys = function(keys, object) {
    var keys, pointer;
    pointer = object;
    keys = keys.split(':');
    for (i = 0; i < keys.length; i++) {

        if (pointer[keys[i]] === undefined) 
            return null;

        pointer = pointer[keys[i]];
    }
    return pointer;
};

console.log(splitKeys(notation, ressource));

此外,如果pointer[keys[i]]null,则循环将继续,因此您可能需要更改测试。

if (pointer[keys[i]] == null)

这将检查nullundefined