从对象获得更深层的属性是非常烦人的。如果父项不存在,则会出错。因此,当父母不存在时,您需要停止前往该房产。
无能为力的方法是:
if (parent.value && parent.value.subvalue && parent.value.subvalue.targetvalue)
var myVal = parent.value.subvalue.targetvalue;
else
var myVal = null;
当您需要经常获得物业时,这是不可行的,您需要一个快捷功能。首先我做了这样的事情:
function getProp(path) {
try {
return eval(path);
}
catch (e) {
return null;
}
};
// getProp('parent.value.subvalue.targetvalue');
但由于至少有两个原因,这是蹩脚的:对象必须在范围内,没有人喜欢使用eval()
。
因此,将对象应用于函数可能更好:
function getProp(path, parent) {
path = path.split('.');
var val = parent;
for (var k = 0; k < path.length; k++) {
var key = path[k];
try {
val = val[key];
}
catch (e) {
return null;
}
}
return val;
};
// getProp('value.subvalue.targetvalue', parent);
但不知怎的,它仍然感觉不对 你怎么做到这一点?什么是最佳做法?
设置父对象可能存在或不存在的对象深度属性更加烦人。
parent = parent || {};
parent.value = parent.value || {};
parent.value.subvalue = parent.value.subvalue || {};
parent.value.subvalue.target = "YAY SOME VALUE!"
你怎么能很好地解决这个问题?
是否还有javascript原生函数,因为这需要经常进行?
答案 0 :(得分:3)
建立方式,没有。如果你在Node.js平台上,你可以试试像dotty这样的包。
无论如何,我认为你能做到的方式有点像这样(我没有测试过它!但我认为它可行):
key.split( "." ).reduce(function( memo, part ) {
if ( typeof memo !== "object" || memo[ part ] === undefined ) {
return;
}
return memo[ part ];
}, obj );
答案 1 :(得分:2)
而不是try..catch,只需测试属性:
function getProp(path, parent) {
path = path.split('.');
for (var k=0, kLen=path.length; k<kLen; k++) {
if (parent.hasOwnProperty(path[k])) {
parent = parent[path[k]];
} else {
return; // undefined? null? error?
}
}
return parent;
}
var obj = {a: {b: {c: 'C', d:'D'}}};
console.log(
getProp('a.b.d', obj) // D
);