设计模式- JavaScript.安全提取深层(可能不存在)对象属性的通用函数
design patterns - JavaScript. Universal function to extract deep (probably non-existent) object property safely
我想设计一个辅助函数,它将尝试执行作为参数深度属性路径传递并返回由它提取的值。
例如考虑以下代码
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.
所以这里一切都很好:提取存在的属性,返回不存在的undefined
,捕获异常,并且在尝试读取undefined
的属性时打印堆栈跟踪。
但是这个函数在javascript代码在服务器上被压缩的情况下是不可靠的,因为对象/属性名可以被压缩器和路径缩短,比如"foo.bar[0]"。"Baz"将不再存在(正确的应该是"a.b[0].c")。
有一个很好的解决方案,除了玩压缩机设置?
答案是否定的。如果不能预测属性和变量的名称,就没有办法安全地重建路径。
可能有一种方法可以使用源映射来解决这个问题,但这通常是不可取的,而且,我认为,要做很多工作。
可以获得由javascript压缩器生成的源地图,并借助if翻译路径。但是这不是我推荐的。
知道深层引用是缓慢的,应该避免。我猜您的helper函数是用于调试的。如果是这种情况,我会简单地使用未压缩的js文件。
相关文章:
- 查找数组's按属性不存在于另一个数组中的对象
- 用javascript在对象上创建不存在的方法
- 从params推送到对象(如果不存在)
- 什么是 ClojureScript 类似地将不存在的对象值设置为 JavaScript 中的 null
- 将值设置为不存在的对象
- 在'用于'如果javascript中不存在对象属性,则循环
- 有没有一个lodash函数可以合并两个对象并删除其中一个对象的属性(如果它们没有)'不存在于另一个中
- Javascript:当属性可能不存在时,在对象中使用OR条件
- 嵌入多对多关系-如果一个新对象还不存在,则添加一个新的对象
- 如果JSON解析对象不存在,如何避免脚本损坏
- 如何在不获得引用错误的情况下将不存在的JavaScript对象与未定义的对象进行比较
- 如何在访问 JavaScript 对象的不存在属性时抛出错误
- 如果属性不存在,则不显示对象的数据
- Javascript 如果元素不存在返回,则导致对象不起作用
- 为什么在 JavaScript 中引用对象的不存在属性不会返回引用错误
- 枚举窗口对象时不存在转义函数
- 将不存在的对象添加到 Firebase 数组中
- 如何仅当对象不存在时才使用javascript添加对象
- 用Javascript处理TestComlete中的对象不存在错误
- 如果子对象不存在,则创建子对象