V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
yangwenqian
V2EX  ›  JavaScript

求助,如何在 json 中检索数据?

  •  
  •   yangwenqian · 2017-02-27 23:51:21 +08:00 · 3770 次点击
    这是一个创建于 2616 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var data = [{
     id: 1,
     value: 2532,
     son: [{
      id: 5,
      value: 543,
      son: [{
       id: 46,
       value: 999879,
       son: [{
        id: 12,
        value: 903,
        son: []
       }]
      }]
     }]
    }, {
     id: 3,
     value: 4684,
     son: [{
      id: 11,
      value: 65,
      son: []
     }, {
      id: 45,
      value: 523423,
      son: []
     }]
    }]

    一个无穷节点的 json,深度有几十级,超大,我要查询 id 为 46 的 value 是多少,求一个 js 函数,谢谢。
    8 条回复    2017-03-03 18:15:06 +08:00
    Cbdy
        1
    Cbdy  
       2017-02-28 00:56:53 +08:00 via Android
    做成一个 b 树?
    czheo
        2
    czheo  
       2017-02-28 03:33:50 +08:00
    function search(id, data) {
    data.forEach( d => {
    if (d.id == id) {
    console.log(d.value)
    }
    search(id, d.son)
    })
    }

    search(46, data)
    vcfvct
        3
    vcfvct  
       2017-02-28 04:26:20 +08:00 via Android
    放到 NoSQL 里面,随便 query 。 MongoDB , elastic search 什么什么的,都可以
    XiaoFaye
        4
    XiaoFaye  
       2017-02-28 04:36:16 +08:00   ❤️ 1
    整个 JSON 就是一个字符串,你直接 indexOf 不行吗?别把简单问题复杂化呀。
    tomoya92
        5
    tomoya92  
       2017-02-28 07:45:04 +08:00 via Android
    lodash?
    spark
        6
    spark  
       2017-02-28 09:52:50 +08:00
    递归
    lhstock
        7
    lhstock  
       2017-02-28 10:07:10 +08:00
    function a(data, id) {
    var value;

    function forEachs(arr) {

    arr.forEach(function(d) {
    find(d, id);
    d.son != 0 && forEachs(d.son) // : find(d.sum);

    })

    }

    function find(d, id) {
    if(d.id == id) {
    value = d.value
    }
    }

    forEachs(data);
    return value
    }

    console.log(a(data, 46));
    genesischou
        8
    genesischou  
       2017-03-03 18:15:06 +08:00
    function search(array, id, temp) {
    let data = array.concat(),
    result = temp || {};
    data.forEach(item => {
    if (item.id === id) {
    result = item;
    return;
    } else if (Object.prototype.toString.call(item.son) === '[object Array]' &&
    item.son.length) {
    result=search(item.son, id, result);
    }
    })
    return result;
    }
    search(data, 46);//{ id: 46, value: 999879,son: [ { id: 12, value: 903, son: [] } ] }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3995 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:01 · PVG 09:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.