我有这样的数据 struct :

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";

Part1名称应填入someObject.part1.name的值,即"Part1".零件2的数量也是一样,里面装满了60.

有没有什么方法可以用纯javascript或JQuery来实现这一点呢?

推荐答案

我只是根据我已有的一些类似代码编写了这段代码,它似乎可以工作:

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有些人已经注意到,如果传递一个字符串,其中最左边的索引与对象中正确嵌套的条目不对应,则此代码将抛出错误.这是一个合理的问题,但IMHO在调用时最好使用try / catchINGO来解决,而不是让此函数为无效索引静默返回undefined.

Javascript相关问答推荐

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

在Angular中将样式应用于innerHTML

为什么!逗号和空格不会作为输出返回,如果它在参数上?

使用LocaleCompare()进行排序时,首先使用大写字母

如何修复我的数据表,以使stateSave正常工作?

类构造函数不能在没有用With Router包装的情况下调用

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

JavaScript是否有多个`unfined`?

Jest toHaveBeenNthCalledWith返回当前设置的变量值,而不是调用时的值

WebSocketException:远程方在未完成关闭握手的情况下关闭了WebSocket连接.&#三十九岁;

Jexl to LowerCase()和Replace()

重新呈现-react -筛选数据过多

不协调嵌入图片

通过解构/功能组件接收props-prop验证中缺少错误"

如何在TransformControls模式下只保留箭头进行翻译?

bootstrap S JS赢得了REACT中的函数/加载

如何正确地在ComponentWillUnmount中卸载状态以避免内存泄漏?

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空

如何阻止外部脚本进入顶层导航

使用Java脚本替换字符串中的小文本格式hashtag