使用字符串路径遍历JavaScript对象和数组的嵌套结构
<p>我有一个像这样的数据结构:</p>
<pre class="brush:php;toolbar:false;">var someObject = {
'part1' : {
'name': 'Part 1',
'size': '20',
'qty' : '50'
},
'part2' : {
'name': 'Part 2',
'size': '15',
'qty' : '60'
},
'part3' : [
{
'name': 'Part 3A',
'size': '10',
'qty' : '20'
}, {
'name': 'Part 3B',
'size': '5',
'qty' : '20'
}, {
'name': 'Part 3C',
'size': '7.5',
'qty' : '20'
}
]
};</pre>
<p>我想使用以下变量访问数据:</p>
<pre class="brush:php;toolbar:false;">var part1name = "part1.name";
var part2quantity = "part2.qty";
var part3name1 = "part3[0].name";</pre>
<p>part1name 应该填充为 <code>someObject.part1.name</code> 的值,即 "Part 1"。part2quantity 也是同样的道理,填充为 60。</p>
<p>有没有办法用纯 JavaScript 或 JQuery 来实现这个需求?</p>
这现在可以通过lodash使用
_.get(obj, property)来支持。请参阅https://lodash.com/docs#get文档中的示例:
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'我刚刚根据我已经有的一些类似代码创建了这个,它似乎可以工作:
Object.byString = function(o, s) { s = s.replace(/\[(\w+)\]/g, '.$1'); // 将索引转换为属性 s = s.replace(/^\./, ''); // 去掉前导点 var a = s.split('.'); for (var i = 0, n = a.length; i < n; ++i) { var k = a[i]; if (k in o) { o = o[k]; } else { return; } } return o; }用法:
在http://jsfiddle.net/alnitak/hEsys/上查看一个工作示例。
编辑 一些人注意到,如果传递一个字符串,其中最左边的索引不对应对象中正确嵌套的条目,这段代码将抛出错误。这是一个有效的关注点,但我认为最好在调用时使用
try / catch块来处理,而不是使这个函数静默地返回undefined。