2011-04-04 55 views
0

我想建立一個基於網站上的一些任意數據的數據庫。這對每個網站來說都很複雜,所以我會留下細節。這裏基本上是我想要做的建立一個數據庫字符串

function level0(arg) { textarea.innerHTML += arg + ' = {'; } 
function level1(arg) { textarea.innerHTML += '\n\t' + arg + ': ['; } 
function level2(arg) { textarea.innerHTML += arg + ', '; } 

等等。事情是一些level1沒有任何孩子,我無法獲得格式正確。

我的三個問題如下。

  1. 期末逗號要在IE打破(謝謝你,MS)
  2. 空1級的,如果他們沒有任何孩子
  3. 關閉/捲曲不應印刷?括號/

HERE'S A DEMO我到目前爲止。注意結尾的逗號,空的sub2不應該被打印,也沒有右括號或大括號

我需要重新設計整個事物嗎? 還有一種方法可以在一個函數中實現這一切,所以我不必擔心添加了另一個圖層嗎?

編輯

這需要在一個字符串格式做,我不能建立一個對象,然後字符串化了,主要是因爲我需要知道我在增加中間哪一個元素。

回答

1

總體看起來,你仍然可能要建立一個對象,但如果你堅持不建造它 - 這裏是一些樣品溶液:

function Printer() { 
    var result = '', 
     lastLevel = null, 
     close = {0:'\n}', 1:']', 2:''}, 
     delimiter = {0: ',\n', 1:',\n', 2:','}; 

    function closeLevel(level, noDelimiter) { 
     if(lastLevel === null) 
      return; 
     var l = lastLevel, d = level == lastLevel;   
     while(l >= level) { 
      result += close[l] + (l == level && !noDelimiter ? delimiter[l]:''); 
      l--; 
     } 
    } 

    this.level0 = function(arg) { 
     closeLevel(0); 
     result += arg + ' = {\n'; 
     lastLevel = 0; 
    }; 

    this.level1 = function(arg) { 
     closeLevel(1); 
     result += '\t' + arg + ': ['; 
     lastLevel = 1; 
    }; 

    this.level2 = function(arg) { 
     closeLevel(2); 
     result += arg; 
     lastLevel = 2; 
    }; 

    this.getResult = function() { 
     closeLevel(lastLevel, true); 
     return result; 
    } 
} 



var p = new Printer(); 
p.level0('head'); 

p.level1('sub1'); 
p.level2('item1');p.level2('item2');p.level2('item3'); 
p.level1('sub2'); 
p.level1('sub3'); 
p.level2('newthing'); 
p.level0('head2'); 

document.getElementById('textarea').value = p.getResult(); 

你可以看到它在行動here

0

我不知道你爲什麼用嵌套數組來構建看起來像對象的東西,使用字符串連接。這樣的事情就會簡單得多,因爲它不需要固定尾隨逗號等:

編輯:我已經更新了代碼,使其跟蹤放在最後一級的

function Db() { 
    var level0, level1; 
    var data = new Object(); 

    this.level0 = function(arg) { 
     level0 = new Object(); 
     data[arg] = level0; 

    } 
    this.level1 = function(arg) { 
     level1 = new Array(); 
     level0[arg] = level1; 
    } 
    this.level2 = function(arg) { 
     level1.push(arg); 
    } 

    this.toString = function() { 
     var s = ''; 
     for(i in data) { 
      s += i + '\n'; 
      for(j in data[i]) { 
       if(data[i][j].length>0) { 
        s += '\t' + j + ': [' + data[i][j] + ']\n' ; 
       } 
      } 
     } 
     return s; 
    } 

} 

使用這樣的:

var db = new Db(); 
db.level0('head'); 
db.level1('sub1'); 
db.level2('item1');db.level2('item2');db.level2('item3'); 

我已經在演示中測試了這個鏈接,你和它工作得很好。

+0

問題2和問題3呢?另外,如果我正在構建一個對象,我無法跟蹤我要做什麼。而你的代碼在jsfiddle上不起作用 – qwertymk 2011-04-04 23:50:57

+0

順便說一句,沒有辦法使用字符串連接來實現你的#2,因爲即使在你有機會添加任何東西之前你打印了level1。如果您爲此添加另一個圖層,肯定會有更靈活的解決方案,但我有點在這裏猜測意圖,所以我保持簡單。 – 2011-04-06 07:58:53