[英]Manipulate JSON tree structure
我正在構建一個表單生成器,它允許用戶有多個問題,包括子問題,以及那些子問題的子問題,等等。
我有一個可以提取數據的方法,但為此,data / json tree
必須采用特定格式:
u1fsQExd1aZmnpL : {
subfields : {
2FNdVdkaefaD6xQ : {
subfields : {
fZ0zn6d51TgVqID : {
subfields : {
05E1JSFYVHJlGVP : {
subfields : {}
}
}
}
}
}
}
}
這是數據開始的方式:
u1fsQExd1aZmnpL : {
2FNdVdkaefaD6xQ : {
fZ0zn6d51TgVqID : {
05E1JSFYVHJlGVP : {}
}
}
}
每個級別上可以有多個項目,例如:
u1fsQExd1aZmnpL : {
2fhjsnNchSJowl2 : {},
2FNdVdkaefaD6xQ : {
fZ0zn6d51TgVqID : {
05E1JSFYVHJlGVP : {},
03jshviJSONDJla : {}
}
}
}
我將數據處理到subfields
表單結構中的方法:
function get_into_subfields(form_structure) {
for(var mainid in form_structure) {
for(var key in form_structure[mainid]) {
if(!form_structure[mainid].hasOwnProperty('subfields')) {
form_structure[mainid]['subfields'] = {};
}
if(key != 'title' && key != 'placeholder' && key != 'help' && key != 'type') {
// || {} so that the key does not have a 'undefined' value which throws an error with the extract_data method
form_structure[mainid]['subfields'][key] = get_into_subfields(form_structure[mainid][key]) || {};
// taking it out keeps the chain going, but it does not put it in the subfields key then
delete(form_structure[mainid][key]);
}
}
}
}
但是,這在第一subfields
級別上是subfields
。
u1fsQExd1aZmnpL : {
subfields : {
2FNdVdkaefaD6xQ : {}
}
}
為了使您大致了解表單的外觀,這是一張帶有一些注釋的圖像,供您查看格式。
注意:
main_id
字段,其中包含其唯一ID
(我忘記將屏幕快照上的My ID
更改為前兩個中的Main ID
。很抱歉。) original_id
數據屬性引用第一個父對象。 (主要問題) parent_id
數據屬性引用其特定的父級。 我需要做的:瀏覽格式
u1fsQExd1aZmnpL : {
subfields : {
2FNdVdkaefaD6xQ : {}
}
}
並以格式顯示
u1fsQExd1aZmnpL : {
subfields : {
2FNdVdkaefaD6xQ : {
subfields : {
fZ0zn6d51TgVqID : {
subfields : {
05E1JSFYVHJlGVP : {
subfields : {}
}
}
}
}
}
}
}
我該如何更改我的get_into_subfields
方法?
這個答案基本上將所有{key: value}
替換為{key: {subfields: value}}
,並通過相同的算法遞歸地將value
返回,直到處理完所有屬性級別為止。
var data = { "u1fsQExd1aZmnpL" : { "2fhjsnNchSJowl2" : {}, "2FNdVdkaefaD6xQ" : { "fZ0zn6d51TgVqID" : { "05E1JSFYVHJlGVP" : {}, "03jshviJSONDJla" : {} } } } }; // this is main object-restructuring function function get_into_subfields(form_structure) { for (var key in form_structure) { form_structure[key] = {subfields: get_into_subfields(form_structure[key])}; } return form_structure; } // this function is simply for showing the code in action // here on Stack Overflow and isn't relevant to the problem function formatObjForHtml(obj) { document.write("<pre>" + JSON.stringify(obj, null, 2) + "</pre>"); } formatObjForHtml(data); // view the data before processing get_into_subfields(data); // process the data formatObjForHtml(data); // view the data after processing
請注意,此答案中Javascript代碼中原始數據的屬性鍵明確地放在引號中,因為其中一些以數字開頭。 如果您正在從JSON接收數據,則這可能與最終應用程序無關。 但是,在包含硬編碼數據的概念驗證代碼中,引號是必需的。
我沒有提供任何涉及您在問題中討論的“標題”,“占位符”,“ main_id”等的代碼。 從您的問題尚不清楚這些對您要詢問的主要問題(即重組數據對象)是否真的很重要。
還要注意,此答案會使原始data
對象發生突變,而不是創建新的修改對象。 如果希望原始數據保持不變,則首先對數據進行深層克隆,然后運行get_into_subfields(clone_of_data)
。
這個答案讓您自己進行所需的任何JSON轉換。 此答案中的JSON字符串化僅用於使結果在Stack Overflow代碼片段查看器中可見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.