我想要将符号(例如'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'...
答案 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)
这将检查null
和undefined
。