按字符串路径访问嵌套的 JavaScript 对象和数组

2022-08-29 22:40:17

我有一个这样的数据结构:

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

我想使用这些变量访问数据:

var part1name = "part1.name";
var part2quantity = "part2.qty";
var part3name1 = "part3[0].name";

part1name 应填充 的值,即“Part 1”。同样的事情与填充了60的part2quantity相同。someObject.part1.name

有没有用纯javascript或JQuery来实现这一点?


答案 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('.');
    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;
}

用法::

Object.byString(someObj, 'part3[0].name');

http://jsfiddle.net/alnitak/hEsys/ 观看工作演示

EDIT 有些人已经注意到,如果传递一个字符串,其中最左侧的索引与对象中正确嵌套的条目不对应,则此代码将引发错误。这是一个有效的问题,但恕我直言,最好在调用时使用块来解决,而不是让这个函数静默地返回无效索引。try / catchundefined


答案 2

现在,lodash 使用 支持此功能。查看 https://lodash.com/docs#get_.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'