【问题标题】:JavaScript resolve reference from string and object [duplicate]JavaScript从字符串和对象解析引用[重复]
【发布时间】:2014-02-12 19:54:25
【问题描述】:

是否可以通过对象本身获取对对象的引用

对象

以及字符串形式的属性

'address.town.street'

所以最后它解决了

obj.address.town.street

我可以想象像 eval() 函数一样的东西。

【问题讨论】:

  • 不。不要使用 eval!
  • 任何快速解释为什么不使用它,除了它很慢?
  • 在一般不好的做法中,当有好的替代品时会教坏习惯(比如这个)

标签: javascript


【解决方案1】:

试试

function getValue(obj, path) {
    return path.split(".").reduce(function(obj, name){ return obj[name]}, obj);
}

【讨论】:

  • 请记住,如果您的任何中间对象,比如town 为空或未定义,这将引发异常。如果您必须添加空值检查,它会变得更加复杂。
  • @ScottSauyet '更复杂'?简单的return obj&&obj[name] 几乎可以解决问题。如果路径元素是假的,它将返回假。
  • @YuryTarabanko:你完全正确。这并不复杂。它不一定会返回 false,而是返回 false-y 值,但无论如何这可能会更好。这比我做过的方法要简单得多(当然问题更复杂),但我认为同样的空值检查问题肯定会在这里引起他们的丑陋。做得很好!
【解决方案2】:

不要使用评估。改用这个

Object.prototype.nestedByString=function(reference){
    var current=this;
    path=reference.split(".");
    for(var i=0;i<path.length;i++){
        current=current[path[i]];
    }
    return current;
}

Here 是一个演示

我想如果你对扩展原生原型过敏,你可以这样做

function nestedByString(obj,reference){
        var current=obj;
        path=reference.split(".");
        for(var i=0;i<path.length;i++){
            current=current[path[i]];
        }
        return current;
}

【讨论】:

  • 破坏Object.prototype的坏主意。
  • 为什么这是个坏主意?它被内置到语言中是有原因的
  • 好吧,因为其他开发人员不知道这种方法的用途。这段代码可能会在没有.hasOwnProperty 检查的情况下打破for-in 循环。
  • 这不使用 for in 循环
  • 您可以通过定义不可枚举的属性在现代浏览器中修复它。 Object.defineProperty(Object.prototype, 'nestedByString', {value: function(){/*blah*/}, enumerable: false})
猜你喜欢
  • 1970-01-01
  • 2017-03-24
  • 2019-08-27
  • 2017-02-14
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
相关资源
最近更新 更多