【问题标题】:Translate string notation to recursive object pointer将字符串表示法转换为递归对象指针
【发布时间】:2012-09-22 14:49:19
【问题描述】:

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

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

【问题讨论】:

  • new 用引号括起来,其中写着message: { new: 'something' }。使用resource.messsage["new"]; 访问它。
  • if (!pointer.hasOwnProperty([keys[i]])) { break; }

标签: javascript object for-loop error-handling


【解决方案1】:

第一个属性名称 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

【讨论】:

  • 没有冒犯,但使用var 不会覆盖参数。它不会对参数产生影响,就像在同一个函数中对同一个变量多次使用var 一样。
  • 再一次,没有冒犯,但是.hasOwnProperty 测试并不安全,因为如果属性是用nullundefined 值定义的,你会得到一个错误(除了在当然遍历结束)。
  • @user1689607:没有被采纳:-),你说得对,我已经编辑了我的答案。
  • 我们刚刚测试了 ({'a':null}).hasOwnProperty('a');表达式,在 Chrome 中返回 true... 与 undefined 相同...
【解决方案2】:

您的代码没有给我任何错误,因此可能存在其他问题。

但是如果你想在资源不匹配时什么都不返回,那么你应该使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2011-12-12
    • 2019-05-09
    • 2012-04-26
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多