javascript - 使用字符串检索对象的值

标签 javascript string object

在这里,我只能使用字符串,因此我还必须从字符串中检索对象的值,简而言之:

从我们编写的对象中检索值:

someObject.property1.name // for say 

但就我而言,我想使用字符串从对象中检索值,即

'someObject.property1.name' // for say

因为我不太有信心自己能做到这一点,所以我更喜欢在互联网上搜索,我得到的最合适的解决方案是

#1

 Object.byString = function(o, s) {
    s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
    s = s.replace(/^\./, '');           // strip a leading dot
    var a = s.split('.');
    while (a.length) {
        var n = a.shift();
        if (n in o) {
            o = o[n];
        } else {
            return;
        }
    }
    return o;
}

来自here

#2

var deep_value = function(obj, path){
    for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
        obj = obj[path[i]];
    };
    return obj;
};

来自here

但正如我所说,它们是最合适的示例,因为它们都采用一个额外参数,即 objO 等等...这给我,所以我尝试改进搜索2中的上述代码,因为它很紧凑,但这导致了失败。该代码是:

    var obj = {
      foo: { bar: 'baz' }
    };

    var deep_value = function(path){
        var obj = path.split('.');
        obj = obj[0];
        for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
            obj = obj[path[i+1]];
        };
        return obj;
    };
alert(deep_value('obj.foo.bar'));  

(我编辑了他的代码只是为了一个实验)。上面的代码不需要 obj 这是一个完美的代码 - 如果它有效 - 并且没有看到任何错误,那么为什么这段代码不起作用,正确的代码是什么?

JSFIDDLE

提前致谢

最佳答案

您的#3 选项存在一些问题:

第一个 obj = obj[0]; 只是有 obj === "obj" 这根本不会帮助你。您需要实际获取 window["obj"] 才能获取顶级对象。

其次,您遍历 for 循环的次数过多,超出了 path 数组的末尾。

如果 obj 位于顶级范围,则在这两个区域中进行更改将使其正常工作:

var obj = {
  foo: { bar: 'baz' }
};

var deep_value = function(path, baseObj){
    baseObj = baseObj || window;
    var obj = path.split('.');
    obj = baseObj[obj[0]];
    for (var i=1, path=path.split('.'), len=path.length; i<len; i++){
        obj = obj[path[i]];
    };
    return obj;
};
alert(deep_value('obj.foo.bar'));  

工作演示:http://jsfiddle.net/jfriend00/jGb5p/

<小时/>

这是一些经过清理的版本:

var obj = {
    foo: { bar: 'baz' }
};

var deep_value = function(path, baseObj){
    baseObj = baseObj || window;
    var pieces = path.split('.');
    // get root level object
    var obj = baseObj[pieces[0]];
    for (var i = 1, len = pieces.length; i < len; i++){
        obj = obj[pieces[i]];
    }
    return obj;
};
console.log(deep_value('obj.foo.bar'));  

工作演示:http://jsfiddle.net/jfriend00/7J4Jb/

关于javascript - 使用字符串检索对象的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24857544/

相关文章:

javascript - 如何删除 Javascript 中继承的对象值?

javascript - 有没有一种简单的方法将复杂的 JS 对象转换为查询参数?

python - 没有反转功能的反转字符串

javascript - Jquery 不返回基本字符串

ruby - 数字到英文单词 ruby

javascript - 不使用 Object.create 创建具有 null 原型(prototype)的 javascript 对象

javascript - 元素在 HTML/CSS 中移出容器

javascript - 将 img 置于 li 内居中

javascript - React-Native .js 变量未找到错误

javascript - 根据另一个对象的值在对象中创建新属性