解释嵌套javascript对象属性访问器字符串的最快方法是什么?

What's the fastest way to interpret a nested javascript object attribute accessor string?

本文关键字:方法 是什么 字符串 javascript 嵌套 对象 属性 访问 解释      更新时间:2023-09-26

假设我有一个嵌套的对象结构,如:

var o = { a: { b: { c: 1 } } };

我有一个像"a.b.c"一样的访问器String

返回指定嵌套值(任意深度[1..n])的最快函数是什么?

。本例中为getNested(o, 'a.b.c') === 1getNested(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')