[英]How to update a nested JSON key in Javascript?
我有一個嵌套的JSON結構,它將始終具有兩個鍵,名稱分別為top_nest
和mid_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_nest
的remark
值設置為mid_nest
, mid_nest_remark
的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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.