[英]Where is the bug in my recursive JSON parser?
我想創建一個遞歸函數來解析類似於json的數據,如下所示。 當key為xtype時,將創建一個新類。 特別是,當xtype = gridpanel / treepanel時,所有屬性都必須是其構造函數參數,否則,將在創建類后添加屬性。 我的遞歸函數如下,在ext-all.js的第21行出現錯誤“太多遞歸”。
請看看,我如何解決這個問題?
主程序中的代碼:
me.recursiveParser(null, data.json);
Ext.apply(me.root, me.parent);
me.desktopCfg = me.root;
recursiveParser函數:
recursiveParser: function(nodeName, jsonData) {
var properties = {};
var isSpecial = false;
var isLeaf = true;
var parent, child, special;
//Base factor
for (var key in jsonData) {
var value = jsonData[key];
//To collect all the properties that is only initialized with '@'.
if (key.toString().indexOf("@") === 0) {
key = key.replace("@", "");
if(typeof(value) === "string"){
properties[key] = "'"+value+"'";
}else{
//Later, should have to deal with the empty value or array with no keys and only elements.
properties[key] = value;
}
if(key === "xtype"){
//To initialize the root
if(nodeName === null){
this.root = this.createNewObject(value, null);
}
if(value === "gridpanel" || value === "treepanel"){
isSpecial = true;
special = value;
}else{
child = this.createNewObject(value, null);
}
}
}else {
isLeaf = false;
}
}
if(isSpecial){
child = this.createNewObject(special, properties);
}
//To add the subnode and its properties to its parent object.
if (nodeName !== null && typeof(nodeName) === "string") {
if(child === null){
Ext.apply(parent, properties);
}else{
Ext.apply(parent, child);
}
}
if(isLeaf){
return;
}
for (var key in jsonData) {
var value = jsonData[key];
if (key.toString().indexOf("@") === 0) {
continue;
}else{
if(value === "[object Object]"){
for(var index in value){
this.recursiveParser(key, value[index]);
}
}else{
this.recursiveParser(key, value);
}
Ext.apply(this.root, parent);
}
}
}
createNewObject函數:
createNewObject: function(objType, properties){
if(objType){
switch (objType){
case "gridpanel":
return new MyProg.base.GridPanel(properties);
break;
case "treepanel":
return new MyProg.base.TreePanel(properties);
break;
case "tabpanel":
return new MyProg.base.TabPanel();
break;
case "tab":
return new MyProg.base.Tabs();
break;
case "formpanel":
return new MyProg.base.Accordion();
break;
case "fieldset":
return new MyProg.base.FieldSet();
break;
case "textfield":
return new MyProg.base.Fields();
break;
case "panel":
return new MyProg.base.Accordion();
break;
default:
return new MyProg.base.Accordion();
};
};
}
data.json:
var data = {
"json": {
"@title": "BusinessIntelligence",
"@xtype": "tab",
"@layout": "accordion",
"items": [
{
"@title": "SalesReport",
"@ctitle": "SalesReport",
"@layout": "column",
"items": [
{}
]
},
{
"@title": "ContentPlayingReport",
"@ctitle": "ContentPlayingReport",
"@layout": "column",
"items": [
{}
]
},
{
"@title": "BusinessIntelligence",
"@ctitle": "BusinessIntelligence",
"@layout": "column",
"items": [
{}
]
}
]
}
}
我修改了遞歸部分,現在看起來更優雅了。 所有的xtype都可以正常工作,除了gridpanel之外,我已經檢查了DOM,所有內容都在其中,但仍然收到錯誤消息:
TypeError: c is undefined
...+g.extraBaseCls);delete g.autoScroll;if(!g.hasView){if(c.buffered&&!c.remoteSort...
ext-all.js (line 21, col 1184416)
我懷疑這是一個ExtJS錯誤。 我將嘗試尋找另一種出路。
遞歸程序:
recursiveParser: function (jsonData) {
var me = this;
var properties = {};
for ( var key in jsonData ){
var value = jsonData[key];
var items = (value.constructor === Array) ? [] : {};
if (value instanceof Object) {
if (isNaN(key)){
if (items.constructor === Array) {
for (var node in value){
items.push(me.recursiveParser(value[node]));
}
properties[key] = items;
} else {
properties[key] = me.recursiveParser(value);
}
} else {
return me.recursiveParser(value);
}
} else {
if (key.toString().indexOf('@') === 0){
key = key.replace('@', '');
properties[key] = value;
}
}
}
return properties;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.