0

我需要将符号(例如'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));

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

4

2 回答 2

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.

演示

于 2012-09-22T14:54:49.120 回答
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

于 2012-09-22T14:57:01.583 回答