有关背景,请参考以下问题:
Access deep object member of embeded JSON

此处提供的解决方案与键值中包含的打包JSON一起使用时效果很好。

但是,它们无法处理JSON具有数组的情况。

我在其他问题DID中引用的原始函数处理数组,但不会处理打包的JSON。

这是原始功能:

function getPathValue(obj, path) {
    return new Function('_', 'return _.' + path)(obj);
}


这是第一个问题的答案:

function getValue(object, path) {
    return path
        .split('.')
        .reduce((o, k) => (typeof o === 'string' ? JSON.parse(o) : o)[k],
object);
}


同样,两者都可以正常工作,但是都不能提供整个程序包。

我需要一个可以同时解决这两个问题的解决方案,并且该解决方案必须可以在IE11的ES5中使用。

这是一个示例API返回的JSON字符串:

{"id":"0001","type":"donut","name":"Cake","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"},{"id":"1002","type":"Chocolate"}]},"data":"{\"domain\":\"cooking.com\",\"id\":53819390}"}


我希望能够使用路径字符串查询值,例如:

value = getPathValue(obj, 'batters.batter[2].id');


要么

value = getPathValue(obj, 'type');


要么

value = getPathValue(obj, 'data.domain');

最佳答案

您可以更换括号并将其余值用作键。在归约内部,可以为未给定的对象使用默认对象。



function getValue(object, path) {
    return path
        .replace(/\[/g, '.')
        .replace(/\]/g, '')
        .split('.')
        .reduce(function (o, k) {
            return (typeof o === 'string' ? JSON.parse(o) : (o || {}))[k];
        }, object);
}
var object = {"id":"0001","type":"donut","name":"Cake","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"},{"id":"1002","type":"Chocolate"}]},"data":"{\"domain\":\"cooking.com\",\"id\":53819390}"},
    path = 'batters.batter[1].id';

console.log(getValue(object, path));

09-10 13:34
查看更多