推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
zhouyou457

新手请教一个问题,javascript 如何通过字符串取 json 对象中的属性?

  •  
  •   zhouyou457 · Nov 8, 2017 · 6074 views
    This topic created in 3292 days ago, the information mentioned may be changed or developed.

    RT

    json 数据类似:

    {
      "obj": {
        "id": "1",
        "value": "2"
      },
      "name" : "3"
    }
    

    期望:

    使用"obj.id"获取 json 对象中的 obj.id 的值

    请问有什么工具能实现嘛?

    17 replies  •  2017-12-01 14:04:49 +08:00
    whypool
    whypool
    Nov 8, 2017
    1
    是 json 对象只能能获取,不用啥工具,
    json 字符串可以直接转 json 对象,不用啥工具,es5 自带 api
    fds
    fds
    Nov 8, 2017
    2
    JSON.parse(字符串) 返回 js 对象
    wenzichel
    wenzichel
    Nov 8, 2017
    3
    sf 中有人问过这个问题,你可以参考下: https://segmentfault.com/q/1010000011812768
    autoxbc
    autoxbc
    Nov 8, 2017
    4
    动态生成代码,你需要 eval() 或者 new Function()
    zhouyou457
    zhouyou457
    OP
    Nov 8, 2017
    5
    @whypool
    @fds
    两位可能没看明白什么意思...我现在需要实现使用字符串获取 json 对象中的值...


    @wenzichel 这个不错,感谢
    lhstock
    lhstock
    Nov 8, 2017
    7
    @zhouyou457 我可能也没看懂你的意思。json 对象是指对象吗。。。。? js 里有非 json 格式的对象吗?
    cloudzqy
    cloudzqy
    Nov 8, 2017
    8
    你说 json 有点误导人了,直接说通过'obj.id'取对象里的值就行了。
    lodash 里面的 get 行,实现原理,看楼上的 sf 答案。
    zthxxx
    zthxxx
    Nov 8, 2017
    9
    另外,正确说法是 「 JS 对象字面量」,你说的 「 JSON 对象」误导了前几楼的人
    zhouxuchen
    zhouxuchen
    Nov 8, 2017
    10
    楼主的问题描述没问题啊……我看了标题就懂了。

    php 里写过一个[类似的]( https://github.com/BarnettZhou/Parser/blob/master/src/AbstractParser.php#L270),270 行开始。
    wxsm
    wxsm
    Nov 8, 2017
    11
    ```javascript
    var deep_value = function(obj, path){
    for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
    obj = obj[path[i]];
    };
    return obj;
    };
    ```
    fds
    fds
    Nov 8, 2017
    12
    ……好吧,那没必要提 JSON 呀,而且你帖子里写的还是“ json 数据”,直接说普通 js 对象呗……我也推荐直接用 lodash 的 get 函数,有需要可以直接看源码。
    Troevil
    Troevil
    Nov 8, 2017
    13
    @wxsm 少考虑了 array 的情况 xx[1].xx
    sammo
    sammo
    Nov 8, 2017
    14
    新手一定知道你遇到的这种问题是不是很 “经典” 的?如果是很经典的那么现成的库比如 lodash underscore 总能找到
    ( 不限于 js 语言 )
    O3YwA1ENkb7i35XJ
    O3YwA1ENkb7i35XJ
    Nov 8, 2017
    15
    通过 `new Function` 来做, 如果为了防止出错, 可以在里面加 try/catch

    ```javascript
    var a = {
    "obj": {
    "id": "1",
    "value": "2",
    "test":[
    {x:123, y:{z:9999,a:[555]}}
    ]
    },
    "name" : "3"
    }

    function getValue (obj, key) {
    return new Function('x', 'return x.' + key)(obj)
    }

    console.log(getValue(a, 'obj.id'))
    console.log(getValue(a, 'name'))
    console.log(getValue(a, 'obj.test[0].x'))
    console.log(getValue(a, 'obj.test[0].y.z'))
    console.log(getValue(a, 'obj.test[0].y.a[0]'))
    ```
    shenjo
    shenjo
    Nov 8, 2017
    16
    lodash:

    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'
    flowfire
    flowfire
    Dec 1, 2017
    17
    如果你不用严格模式可以试试 with [光速逃
    var json = JSON.parse('{"a": 1}');
    with (json) {
    console.log(a);
    }
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2142 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 14:32 · PVG 22:32 · LAX 06:32 · JFK 09:32
    ♥ Do have faith in what you're doing.