javascript中eval()的替代物,嵌套对象

问题描述 投票:0回答:2

Eval通常被认为是一个坏主意。

对嵌套对象的eval是否有一种优雅的解决方案。

所以我的评估是

eval( "$scope" + lookup_string) 

由于Javascript对象似乎是关联数组,我尝试过

$scope[lookup_string] 

这很好,直到我找到一些嵌套对象。

因此,如果我的字符串中包含点,例如

lookup_string = "object1.object2.object3"

这是一个评估。但不能作为associative_array查找,因为它将字符串视为一个,而不是三个嵌套的查找。

现在,我知道我可以分割字符串,并查找每个部分,但是,这似乎是相当不错的工作(与评估字符串相比)。

还有其他干净/优雅的替代方法吗?

javascript eval
2个回答
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
}

UPDATE

好吧,如果您只想使用香草,并且确定所开发的环境支持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


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)
}

console.log(oTest.mypc.hdds[0].hddid)
console.log( 'ok: '+ getProperty(oTest, 'mypc.hdds[0].hddid')) 
console.log( 'undefined path: '+ getProperty(oTest, 'mypc.hdds[10].hddid')) 
© www.soinside.com 2019 - 2024. All rights reserved.