JavaScript。安全提取深层(可能不存在)对象属性的通用函数

JavaScript。安全提取深层(可能不存在)对象属性的通用函数,javascript,design-patterns,optimization,Javascript,Design Patterns,Optimization,我想设计一个helper函数,它将尝试执行作为参数deep property path传递的命令,并返回由它提取的值 例如考虑下面的代码 var foo = { bar: [ { baz: "someValue" } ] }; function getByPath(path) { var val; try { val = eval(path);

我想设计一个helper函数,它将尝试执行作为参数deep property path传递的命令,并返回由它提取的值

例如考虑下面的代码

var foo = {
        bar: [
            {
                baz: "someValue"
            }
        ]
};

function getByPath(path) {
    var val;
    try {
        val = eval(path);    
    } catch(e) {
        console.error(e);
    }
    return val;
}

var path1 = "foo.bar[2].baz";
var path2 = "foo.bar[0].baz";
var path3 = "foo.bar.baz";

console.log(path1 + ": " + getByPath(path1));
console.log(path2 + ": " + getByPath(path2));
console.log(path3 + ": " + getByPath(path3));
console.log("done.");
输出

TypeError: Cannot read property 'baz' of undefined
    at eval (eval at getByPath (unknown source), <anonymous>:1:11)
    at getByPath (<anonymous>:13:15)
    at <anonymous>:24:28
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)getByPath @ VM317:15(anonymous function) @ VM317:24InjectedScript._evaluateOn @ VM212:895InjectedScript._evaluateAndWrap @ VM212:828InjectedScript.evaluate @ VM212:694
VM317:24 foo.bar[2].baz: undefined
VM317:25 foo.bar[0].baz: someValue
VM317:26 foo.bar.baz: undefined
VM331:7 done.
TypeError:无法读取未定义的属性“baz”
在评估时(在getByPath(未知源)进行评估):1:11
在getByPath(:13:15)
时间:24:28
在Object.InjectedScript.\u evaluateOn(:895:140)
在Object.InjectedScript.\u evaluateAndWrap(:828:34)
在Object.InjectedScript.evaluate(:694:21)getByPath@VM317:15(匿名函数)@VM317:24InjectedScript.\u evaluateOn@VM212:895InjectedScript.\u evaluateAndWrap@VM212:828InjectedScript.evaluate@VM212:694
VM317:24 foo.bar[2].baz:未定义
VM317:25 foo.bar[0]。baz:someValue
VM317:26 foo.bar.baz:未定义
VM331:7完成。
因此,这里一切都很好:提取一个存在的属性,
undefined
返回不存在的属性,捕获一个异常,并在尝试读取
undefined
的属性时打印stacktrace

但是,如果javascript代码在服务器上被压缩,则此函数不可靠,因为对象/属性名称可以通过压缩器缩短,类似“foo.bar[0].baz”的路径将不再存在(正确的路径将类似于“a.b[0].c”)


除了使用压缩器设置,还有好的解决方案吗?

简单的答案是否定的。如果无法预测属性和变量的名称,则无法安全地重建路径


也许有一种方法可以解决这个问题,但这通常是不可取的,而且,我认为,需要做大量的工作。

可以通过javascript压缩器和if-translate路径获得源映射。然而,这不是我的建议


知道深度引用很慢,应该避免。我猜你的助手函数是用来调试的。如果是这种情况,我只会使用未压缩的js文件。

更好的解决方案是解析引用序列。您的解决方案要求搜索从函数词法范围内的命名变量开始,这大大限制了它的实用性。