我可以只用一个字符串访问某些嵌套对象中的值吗?

时间:2018-12-07 00:43:30

标签: javascript json object

我想知道是否可以仅使用一个字符串访问嵌套对象内的值。假设我有一个像这样的对象:

skill: {
    skillDetails: {
        developerDetails: {
            developerName: "mr. developer"
        }
    }
}

有没有办法像这样通过“ JSON路径”获取值:skill["skillDetails.developerDetails.developerName"]

我之所以这样问,是因为我试图将key和对象传递给一个本质上返回object[key]的函数(我无法修改)

不确定这是否可行,所以我想请你们提供一些建议。

谢谢!

3 个答案:

答案 0 :(得分:2)

不幸的是,没有快速的内置方法可以完成此操作-您将需要一个辅助函数。

lodash使用_.get(obj, property)支持此操作。

从文档中

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// → 3

_.get(object, ['a', '0', 'b', 'c']);
// → 3

_.get(object, 'a.b.c', 'default');
// → 'default'

答案 1 :(得分:2)

没有“内置”方法,但是可以通过split()reduce()来实现此目的的简单解决方案(不需要第三方库),如下所示:

var skill = {
  skillDetails: {
    developerDetails: {
      developerName: "mr. developer"
    }
  }
}

var path = "skillDetails.developerDetails.developerName";

var value = path
.split('.') // Split path into parts by '.'
.reduce((obj, part) => obj ? obj[part] : undefined, skill); // Extract value via reduction

console.log(value)

答案 2 :(得分:1)

普通JS的事实上的标准是使用Array.reduce,因为使用它的累加器,它可以使您一直走“路”,直到获得所需的值为止,但在用例中,您可能会在路径上有一个功能被忽略。这是一个示例:

var obj = {
  foo: {
    bar: {
      fooBar: "BARFOO",
      foo: function() { return { c: 'BAR' }}
    }
  }
}

const get = (obj, path) => path.split('.').reduce((r,c) => {
  return r ? typeof r === 'function' ? r()[c] : r[c] : undefined
}, obj)

console.log(get(obj, 'foo.bar.fooBar'))
console.log(get(obj, 'foo.bar.foo'))
console.log(get(obj, 'foo.bar.foo.c'))

如您所见,如果您想获取foo.bar.foo.c的实际值,则必须通过一个函数并执行它...现在,如果您打算使用{{3} }来自lodash:

var obj = {
  foo: {
    bar: {
      fooBar: "BARFOO",
      foo: function() { return { c: 'BAR' }}
    }
  }
}

console.log(_.result(obj, 'foo.bar.fooBar'))
console.log(_.result(obj, 'foo.bar.foo'))
console.log(_.result(obj, 'foo.bar.foo.c'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

某种与_.result保持一致的东西只会让您获得价值,而不会遍历函数,而_.get会在path有效的情况下返回布尔值。

相关问题