解释嵌套javascript对象属性访问器字符串的最快方法是什么?
What's the fastest way to interpret a nested javascript object attribute accessor string?
假设我有一个嵌套的对象结构,如:
var o = { a: { b: { c: 1 } } };
我有一个像"a.b.c"
一样的访问器String
返回指定嵌套值(任意深度[1..n])的最快函数是什么?
。本例中为getNested(o, 'a.b.c') === 1
和getNested(o, 'a') === {b:{c:1}}
。
getNested
的最佳实现是什么?
又一个变体:
function getNested(obj, path) {
path.replace(/[^'.]+/g, function (p) {
obj = obj[p];
});
return obj;
}
我不愿意在没有分析代码的情况下给出答案,但是考虑到eval
可能很慢,forEach
比仅仅运行for循环要慢,我将从:
// precondtion: path is a nonempty string
function getNested(obj, path) {
var fields = path.split(".");
var result = obj;
for (var i = 0, n = fields.length; i < n; i++) {
result = result[fields[i]];
}
return result;
}
但是我会用其他方法来测试。
我不认为在split
上尝试优化数组结构是值得的,但如果你对最快的方式感兴趣,这只是一件事。
附录
这里是一个文本,以便您可以看到它的行动:
$ node
> function getNested(obj, path) {
... var fields = path.split(".");
... var result = obj;
... for (var i = 0, n = fields.length; i < n; i++) {
... result = result[fields[i]];
... }
... return result;
... }
> var o = { a: { b: { c: 1 } } };
> getNested(o, "a")
{ b: { c: 1 } }
> getNested(o, "a.b.c")
1
**附录2 **
太尴尬了——我之前把var
忘在result
前面了。这样可能会加快一点速度!
其他尝试:
- 忘记
n
的"优化",只做i < test.length
的for循环测试(无论如何可能被优化掉) - 用
substring
s和indexOf
s替换split - 使用正则表达式
/'./
而不是原始字符串"."
进行分割
可以这样写:
function getNested(o, path) {
var parts = path.split('.');
var member = o;
while (member && parts.length) {
member = member[parts.shift()];
}
return member;
}
这可能不是最快的解决方案,但可能是一个有用的起点。
try{
var prop=eval(string);
}
catch(er){
prop=undefined;
}
我的方法
var o = { a: { b: { c: 1 } } };
var getNested = function(p) {
var t;
p.split('.').forEach(function(e) {
t = o[e] || t[e]
});
return t
}
你可以试试:
getNested('a.b.c')
相关文章:
- 打破承诺链的好方法是什么
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- knex:根据结果创建数组的合适方法是什么
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 使用Modernizr检测移动设备最可靠的方法是什么
- 确定var是否是javascript中的elementFinder对象的方法是什么
- 用javascript修复这个JSON对象字符串最干净的方法是什么
- 让会话值可用于JavaScript的好方法是什么
- 从AngularJs获取谷歌地图对象的正确方法是什么
- 使用ReactJS和Flux架构从服务器获取数据的正确方法是什么
- 列出没有 mysql 的元素的最佳方法是什么
- 克服错误的更优雅的方法是什么:需要对象说明符.当通过JXA通过Messages发送SMS时,参数没有对象说明符
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 在 Javascript 中实现解耦代码/回调的正确方法是什么?
- 使用Javascript,获取元素的方法是什么,基于打开和关闭标记之间的文本
- 在d3.json中使用d3.csv组合多个csv文件数据输入的最佳方法是什么
- 直接在DOM事件处理程序中调用作用域函数的最短方法是什么