2011-09-28 195 views
2

var string = 'object.data.path';字符串作为对象变量的对象引用

这是一个类似于变量路径的字符串。

如何从该字符串返回相应的变量?

喜欢的东西转化串入return object.data.path;

这背后的事情是该字符串可能是更长的时间(深),如:

var string = 'object.data.path.original.result';

+0

字符串从哪里来? – Dennis

+0

HTML5数据属性名称,破折号用点代替。 – jolt

回答

3
function GetPropertyByString(stringRepresentation) { 
    var properties = stringRepresentation.split("."), 
     myTempObject = window[properties[0]]; 
    for (var i = 1, length = properties.length; i<length; i++) { 
    myTempObject = myTempObject[properties[i]]; 
    } 

    return myTempObject; 
} 


alert(GetPropertyByString("object.data.path")); 

这是假定你的第一个(在这种情况下,称为object是全球性的) 或者,虽然不推荐,但可以使用eval函数。

+0

谢谢!已经作出了类似的功能,但希望有除了循环以外的其他方式.. – jolt

+0

管理单元! (好吧,差不多......) – nnnnnn

+0

对于每次迭代,你应该检查'myTempObject'是否仍然是一个对象,然后才能检索它的属性... –

3

假设你不想只是使用eval你可以尝试这样的事:

function stringToObjRef(str) { 
    var keys = str.split('.'), 
     obj = window; 
    for (var i=0; i < keys.length; i++) { 
     if (keys[i] in obj) 
     obj = obj[keys[i]]; 
     else 
     return; 
    } 

    return obj; 
} 

console.log(stringToObjRef('object.data.path.original.result')); 

使用for循环去下一层的时间,返回undefined如果链中的一个特定的键未定义。

+0

谢谢,由于声誉较低而给予Chips_100奖励。一个奖金寿'未定义的回报。 – jolt

+0

谢谢。 (必须花费额外的时间来考虑让Chips_100在我之前回答的未定义测试。)关于您对Chips有关寻找无循环方式的评论,您可以使用函数递归来实现... – nnnnnn

+0

函数递归仍然是一个循环,而不是一个“记录”的循环。 – jolt