2014-01-05 176 views
0

編輯時:HTML格式轉換成JSON

$.fn.serializeObject = function() { 
var o = {}; 
var a = this.serializeArray(); 
$.each(a, function() { 
    var value = this.value || ''; 
    if (/^\d+$/.test(value)) 
     value = +value; 

    if (o[this.name] !== undefined) { 
     if (!o[this.name].push) { 
      o[this.name] = [o[this.name]]; 
     } 
     o[this.name].push(value); 
    } else { 
     o[this.name] = value; 
    } 
}); 
return o; 
};` 

編輯以希望更清楚。

困難的包裹着我 - 睡眠剝奪=瘋狂。

我有一個表單,它將數據簡單地串行化成JSON並存儲起來供以後使用。

<form id="form" method="post"> 

a? <input class="number" type="text" name="a" size="5" maxlength="5"/><br/> 

項目1:

Type?:<br/> 
<select size="2" name="type"> 
    <option value="1">b</option> 
    <option value="2">c</option> 
</select> 

d:<input class="number" type="text" name="d" maxlength="2" size="2"/> <br/> 
e:<input class="number" type="text" name="e" maxlength="2" size="2"/> <br/> 

<p>Item 2:</p> 


Type?:<br/> 
<select size="2" name="type"> 
    <option value="1">b</option> 
    <option value="2">c</option> 
</select> 

d:<input class="number" type="text" name="d" maxlength="2" size="2"/> <br/> 
e:<input class="number" type="text" name="e" maxlength="2" size="2"/> <br/> 

<input type="submit" /> 

當表單序列化的結果,我得到的是:

JSON{ 
    "a":1, 
    "type":[1,2], 
    "d":[99,33], 
    "e":[99,33] 
} 

什麼,我需要的是JSON一些典型的樹狀結構每個物品都有自己的等級,如下所示:

{ 
"a": "1", 

"item1": 
{ 
    "type": "1", 
    "d": "99", 
    "e": "99", 
}, 
"item2": 
{ 
"type": "2", 
"d": "33", 
"e": "33", 
} 

理想情況下,我希望有一個選項,用戶可以說明表單應該請求信息的數量,但我首先需要一個基本的工作示例。

一旦我有了這些數據,我就會將它轉換成JSON,並且如果可能的話,會喜歡樹狀結構。任何幫助讚賞。這篇文章How to serialize a form into an object (with tree structure)?幫助了很多,但它的HTML結構有問題。再次感謝。

+1

我很難理解你的問題?考慮改寫。你是否試圖動態模板選擇和fb輸入? – Nix

+0

@尼克斯 - 抱歉的混亂。我需要幾個項目的細節。每個項目是相同的對象類型,並具有相同的字段,但會有不同的值。這些幫助有用? – null

+0

不是真的......也許別人可以解釋你需要什麼。也許從你無法弄清楚的事情開始吧? – Nix

回答

0

我會介紹新的HTML屬性:

<input data-item="1" class="number" type="text" name="d" maxlength="2" size="2"/> 
<select data-item="1" size="2" name="type"> ... 

,然後我會用

$(this).attr('data-item'); 

讀值,並將其放置在合適的對象。另一種選擇是僅獲取指定的item元素(在某些循環):

$('input[data-item="1"], select[data-item="1"]').each(...); 

編輯 我看到使用serializeArray()來實現這一點沒有漂亮的方式,但我會去的項目數name屬性(名稱=「TYPE1」)或再次循環以i爲項目編號:

$('[data-item="'+i+'"]', this).serializeArray(); 
0

一個快速和骯髒的方法是這樣的:改變你的輸入,基於其項目編號名稱:

<input name="item1.a" ... /> 
<input name="item2.a" ... /> 
<input name="item3.a" ... /> 

然後修改serializeObject()找點:

... 
    $.each(a, function() { 
     var value = this.value || ''; 
     if (/^\d+$/.test(value)) 
      value = +value; 

     if (this.name && this.name.indexOf('.')) 
     { 
      var split = this.name.split('.'); 
      o[ split[0] ] = o[ split[0] ] || {}; 
      o[ split[0] ][ split[1] ] = value 
     } 
     else if (o[this.name] !== undefined) { 
      if (!o[this.name].push) { 
       o[this.name] = [o[this.name]]; 
      } 
      o[this.name].push(value); 
     } else { 
      o[this.name] = value; 
     } 
    }); 
... 

注:此代碼是不完美的,但它會讓你在正確的方向!

+0

相同嗨,感謝您花時間提出解決方案。我不介意快速,但我喜歡漂亮:)這可以修改爲動態嗎?最終的遊戲是詢問用戶需要添加多少物品,然後生成需要填充的字段 – null

+0

是的,只需將我的解決方案與@ zola's結合使用並使用$(this).attr('data- item')'代替第一個'if'語句中的'this.name'。 – redolent

+0

好的,謝謝,我會給它一個旋轉。 – null