对于嵌套对象上的eval是否有优雅的解决方案。
所以我的评估是
eval( "$scope" + lookup_string)
由于Javascript opbject似乎是相互关联的数组,我试过
$scope[lookup_string]
这一直很好,直到我得到一些嵌套对象。
所以如果我的字符串包含点,例如
lookup_string = "object1.object2.object3"
这可以作为评估。但不是作为associative_array查找,因为它将字符串视为一个,而不是三个嵌套查找。
现在我知道我可以分割字符串,并查找每个部分,但这似乎相当有用(与评估字符串相比)。
还有其他干净/优雅的替代品吗?
答案 0 :(得分:3)
简单的while循环通常足以解决这个问题。
function nameSpace(obj, path) {
var property,
path = path.split('.');
while (property = path.shift()) {
if (typeof obj[property] === 'undefined')
return undefined;
obj = obj[property]
}
return obj
}
<强>更新强>
如果您只是想使用香草而且您确定您正在开发的环境支持ECMA-5,您可以做类似的事情
function namespace(object, path) {
var result = path.split('.').reduce(function (value, index) {
return value[index]
}, object)
return result;
}
console.log(namespace(obj, 'a.b.value'))
如果没有本地实现,你也可以使用像lodash这样的库添加reduce
。
答案 1 :(得分:0)
这个适用于数组项:
var oTest = {
"mypc": {
"cpu": {
"cores": 1,
"manufacturer": "",
"model": "",
"speed": 0
},
"group": "",
"hdds": [{
"capacitygb": 0,
"driveletter": "c",
"hddid": "a18822e92ff6e14cbc905bf4df13f8d3",
"manufacturer": "",
"port": 0,
"type": ""
}]
}
};
var getProperty = function (obj, path) {
return path.split(/(\[|\]|\.)/).reduce(function (x, y) {
return ('[].'.indexOf(y) > -1) ? x : (x === Object(x) && y in x) ? x[y] : undefined;
}, obj)
}
alert(oTest.mypc.hdds[0].hddid)
alert( 'ok: '+ getProperty(oTest, 'mypc.hdds[0].hddid'))
alert( 'undefined path: '+ getProperty(oTest, 'mypc.hdds[10].hddid'))
&#13;