Javascript:通过将路径作为字符串传递给对象来获取对象的深层值

Javascript: Get deep value from object by passing path to it as string

本文关键字:获取 对象 取对象 路径 字符串 Javascript      更新时间:2023-09-26

可能重复:
使用字符串键访问嵌套的JavaScript对象

也许标题不够清楚,我只是不知道如何具体说明我要找什么,而且我的英语真的很差,对不起。

我正在尝试创建一个函数,它返回对象值,但也能很好地处理嵌套对象。例如:

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

我想通过向函数提供字符串"foo.bar"来访问obj.foo.bar的值。

function(obj, path) {
  // Path can be "foo.bar", or just "foo".
}

谢谢!

这是正确的:

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;
};

这是证明/演示:jsfiddle.net/tadeck/5Pt2q/13/

编辑:我删除了多余的变量,缩短了代码。

考虑一下:

var obj = {
  foo: { bar: 'baz' }
};
function deepFind(obj, path) {
  var paths = path.split('.')
    , current = obj
    , i;
  for (i = 0; i < paths.length; ++i) {
    if (current[paths[i]] == undefined) {
      return undefined;
    } else {
      current = current[paths[i]];
    }
  }
  return current;
}
console.log(deepFind(obj, 'foo.bar'))

你的意思是这样的吗?这是一个递归版本

function recLookup(obj, path) {
    parts = path.split(".");
    if (parts.length==1){
        return obj[parts[0]];
    }
    return recLookup(obj[parts[0]], parts.slice(1).join("."));
}

请参阅http://jsfiddle.net/kExSr/

类似于:

function(obj, path) {
  var current=obj; 
  path.split('.').forEach(function(p){ current = current[p]; }); 
  return current;
}

您需要将字符串拆分到点上,然后重复索引到对象中,例如沿着以下行:

function goDeep(obj, path) {
    var parts = path.split('.'),
        rv,
        index;
    for (rv = obj, index = 0; rv && index < parts.length; ++index) {
        rv = rv[parts[index]];
    }
    return rv;
}

实例

这之所以有效,是因为您可以通过两种不同的方式访问对象的属性:有使用文字的虚线语法(obj.foo),也有使用字符串的括号语法(obj["foo"])。在后一种情况下,字符串可以是任何表达式的结果,而不必是字符串文字。在所有中,rv设置为相同的值:

rv = obj.foo.bar;
// Or
rv = obj.foo["bar"];
// Or
f = "foo";
rv = obj[f].bar;
// Or
s = "b";
rv = obj.foo[s + "ar"];