簡體   English   中英

操作JSON樹結構

[英]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.

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