簡體   English   中英

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

[英]How to update a nested JSON key in Javascript?

我有一個嵌套的JSON結構,它將始終具有兩個鍵,名稱分別為top_nestmid_nest 但是,這兩個鍵將嵌套在什么級別上,具體取決於數據集。

top_nest和mid_nest中的每個都有一個“備注”,該備注最初始終為null。 我想用數組中的值填充該remark鍵。

下面是我只為mid_nest鍵嘗試的代碼:

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)由於其余的處理(如),無法通過數組值更改注釋鍵並將其分配回原始結構。

任何幫助都感激不盡。

謝謝。

盡管您將需要通過JSON重新進行處理,但您的函數對我而言似乎過於復雜。 看一下這個工作示例。 這應該簡單地將mid_nestremark值設置為mid_nestmid_nest_remarkremarktop_nesttpo_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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM