代码之家  ›  专栏  ›  技术社区  ›  A.G.Progm.Enthusiast

如何在Javascript中更新嵌套的JSON键?

  •  0
  • A.G.Progm.Enthusiast  · 技术社区  · 5 年前

    我有一个嵌套的JSON结构,它的名字总是有两个键 top_nest mid_nest

    top_nest和mid_nest中的每一个都有一个“备注”,最初总是空的。 我想填充它 remark 使用数组中的值设置。

    中窝 关键:

    var nestedjson = {
      edition: '1.3.0',
      OUTER_MOST: {
        secondnest: {
          mainstruct: {
            top_nest: [
              {
                portblair: 'mtlb_wc_way0_fcl',
                dir: 'left',
                locs: ['/loc/local'],
                remark: 'crc',
                id: 1544593588899,
                $count: 0,
                $parent: 0,
                $level: 1,
                $height: 256,
              },
            ],
    
            mid_nest: [
              {
                ept: 'qop[3:0:0]',
                remark: null,
                race: 'false',
                spt: ['mki[2:7:21]', 'epk[20:14.2:9.8]'],
                inod: 'u_pqp',
                mlace: 'pqp',
                portblair: ['qq[31:9:24]', 'ax[2:16:1]'],
                marcus: [
                  {
                    dir: 'left',
                    h_loc: ['/op/locs'],
                    sign: '0',
                    portblair_w: '81',
                    race_duty: '0',
                  },
                  {
                    race_duty: '0',
                    portblair_h: '28',
                    sign: '2',
                    dir: 'rigt',
                    h_loc: ['/pr/op'],
                  },
                ],
              },
              {
                eptt: 'yie[3:0:0]',
                remark: null,
                race: 'false',
                spt: ['mki[2:7:21]', 'epk[20:14.2:9.8]'],
                inod: 'u_pqp',
                mlace: 'pqp',
                portblair: ['qq[31:9:24]', 'ax[2:16:1]'],
                marcus: [
                  {
                    dir: 'left',
                    h_loc: ['/op/locs'],
                    sign: '0',
                    portblair_width: '8',
                    race_duty: '0',
                  },
                  {
                    race_duty: '0',
                    portblair_width: '8',
                    sign: '2',
                    dir: 'rigt',
                    h_loc: ['/pr/op'],
                  },
                ],
              },
            ],
          },
          qq: 'ss',
        },
      },
      dst: 'dss',
    };
    
    // function to take out the mid_nest structure to change its remark key
    function findJson(json) {
      var mid_ret = [];
      for (var k in json) {
        if (k === 'mid_nest') {
          //console.log("breaking as mid reached");
          mid_ret = json[k];
          break;
        } else if (typeof json[k] === 'object') {
          findJson(json[k]);
        }
      }
    
      console.log('--after break--');
      return mid_ret;
    }
    
    var mid_ret = findJson(nestedJson);
    var remark_arr = ['remark_1', 'remark2']; // array for assigning remarks
    
    for (var i in remark_arr) {
      var rem = remark_arr;
      mid_ret[i]['remark'] = rem;
    }
    
    // assigning the changed mid_ret back to the original nestedJson
    for (var k in nestedJson) {
      if (k === 'mid_nest') {
        nestedJson[k] = mid_ret;
      } else if (typeof nestedJson[k] === 'object') {
        continue;
      }
    }
    

    findJson() ,

    (i) 即使在匹配mid_nest之后,循环也不会中断,仍然在迭代,因此不会返回正确的mid_nest值。

    (ii)正因为如此,处理的其余部分(如通过数组值更改备注键并将其分配回原始结构)不起作用。

    任何帮助都将不胜感激。

    谢谢

    1 回复  |  直到 5 年前
        1
  •  1
  •   ViqMontana    5 年前

    对我来说,您的函数似乎过于复杂,尽管您需要通过JSON重新定义。看看这个工作示例。这只需设置 remark 价值 mid_nest mid_nest_remark 评论 top_nest tpo_nest_remark . 我会让你自己调整的。

    var nestedjson = {
      edition: '1.3.0',
      OUTER_MOST: {
        secondnest: {
          mainstruct: {
            top_nest: [
              {
                portblair: 'mtlb_wc_way0_fcl',
                dir: 'left',
                locs: ['/loc/local'],
                remark: 'crc',
                id: 1544593588899,
                $count: 0,
                $parent: 0,
                $level: 1,
                $height: 256,
              },
            ],
    
            mid_nest: [
              {
                ept: 'qop[3:0:0]',
                remark: null,
                race: 'false',
                spt: ['mki[2:7:21]', 'epk[20:14.2:9.8]'],
                inod: 'u_pqp',
                mlace: 'pqp',
                portblair: ['qq[31:9:24]', 'ax[2:16:1]'],
                marcus: [
                  {
                    dir: 'left',
                    h_loc: ['/op/locs'],
                    sign: '0',
                    portblair_w: '81',
                    race_duty: '0',
                  },
                  {
                    race_duty: '0',
                    portblair_h: '28',
                    sign: '2',
                    dir: 'rigt',
                    h_loc: ['/pr/op'],
                  },
                ],
              },
              {
                eptt: 'yie[3:0:0]',
                remark: null,
                race: 'false',
                spt: ['mki[2:7:21]', 'epk[20:14.2:9.8]'],
                inod: 'u_pqp',
                mlace: 'pqp',
                portblair: ['qq[31:9:24]', 'ax[2:16:1]'],
                marcus: [
                  {
                    dir: 'left',
                    h_loc: ['/op/locs'],
                    sign: '0',
                    portblair_width: '8',
                    race_duty: '0',
                  },
                  {
                    race_duty: '0',
                    portblair_width: '8',
                    sign: '2',
                    dir: 'rigt',
                    h_loc: ['/pr/op'],
                  },
                ],
              },
            ],
          },
          qq: 'ss',
        },
      },
      dst: 'dss',
    };
    
    var remark_arr = ['remark_1', 'remark2'];
    
    $( document ).ready(function() {
        var val = assignRemarks( nestedjson );
        console.log(val)
    });
    
    function assignRemarks(theObject) {
        var result = null;
        if(theObject instanceof Array) {
            for(var i = 0; i < theObject.length; i++) {
                result = assignRemarks(theObject[i]);
                if (result) {
                    break;
                }   
            }
        }
        else
        {
            for(var prop in theObject) {
                if(prop == 'top_nest') {
                  //set the remark property for top-nest here
                  theObject[prop].forEach(x => x.remark = 'top_nest_remark')
                }
                if(prop == 'mid_nest') {
                  for (let i = 0; i < theObject['mid_nest'].length; i++)
                  {
                    //set the remark property for mid-nest here
                    theObject['mid_nest'][i].remark = remark_arr[i];
                  }
                }
                if(theObject[prop] instanceof Object || theObject[prop] instanceof Array) {
                    result = assignRemarks(theObject[prop]);
                } 
            }
        }
        return theObject;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>