如果我使用变量作为关键字,如何访问多级属性?JavaScript:使用变量的访问对象多级属性
这不是工作:
var obj = {
first: {thirst: "yo"},
second: {beckon: "dud"}
}
var key = "first.thirst";
var result = obj[key];
如果我使用变量作为关键字,如何访问多级属性?JavaScript:使用变量的访问对象多级属性
这不是工作:
var obj = {
first: {thirst: "yo"},
second: {beckon: "dud"}
}
var key = "first.thirst";
var result = obj[key];
当你使用一个字符串作为属性名称JavaScript,没有字符是禁止的:包括句号。所以,你可以轻松拥有这样一个对象属性:
var o = {
'first.second.third': 'value';
}
鉴于此,它显然无法实现您的解决方案。
但是,只要你没有在你的财产的命名使用时间,你可以创建一个函数,这是否:
function resolve(obj, path){
path = path.split('.');
var current = obj;
while(path.length) {
if(typeof current !== 'object') return undefined;
current = current[path.shift()];
}
return current;
}
然后,你可以拨打:
var key = "first.thirst";
var result = resolve(obj, key);
您可以遍历树,为@RobW说:
var traverse = function (obj, keys) {
return keys.split('.').reduce(function (cur, key) {
return cur[key];
}, obj);
};
var obj = {
first: { thirst: 'yo' },
second: { beckon: 'dud' }
};
var keys = 'first.thirst';
console.log(traverse(obj, keys));
哦,不容易的单行修正:(但至少这会起作用!谢谢大家! – EricC
两个注释:首先,'traverse'是一个可怜的名字:这个函数遍历对象树的事实只是一个实现细节,它实际上做的是在对象内部解析路径;它恰好使用了一个失败深度优先遍历;其次,如果路径无效,这个函数会抛出一个异常,也许这就是你想要的,但是在JavaScript中,通常不会。 –
function getMultiLevelProp(obj, key){
if(typeof obj == "object"){
var keyQueue = key.split(".").reverse();
var tempVal = obj, currentKey;
while((currentKey = keyQueue.pop()) != undefined)
tempVal = tempVal[currentKey];
return tempVal;
}
return false;}
这可以工作
你不能,除非你使用'eval'或写一个自定义函数遍历树。 –
把这个放在一个答案中,举例说明它是如何完成的,我可以接受它作为答案:) – EricC