我想知道是否可以仅使用一个字符串访问嵌套对象内的值。假设我有一个像这样的对象:
skill: {
skillDetails: {
developerDetails: {
developerName: "mr. developer"
}
}
}
有没有办法像这样通过“ JSON路径”获取值:skill["skillDetails.developerDetails.developerName"]
?
我之所以这样问,是因为我试图将key
和对象传递给一个本质上返回object[key]
的函数(我无法修改)
不确定这是否可行,所以我想请你们提供一些建议。
谢谢!
答案 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>