2012-07-07 29 views
31

我有一點麻煩序列化形式jQuery的serializeArray()的鍵值對

<form> 
    <input type="text" name="name1" value="value1"/> 
    <input type="text" name="name2" value="value2"/> 
</form> 

$(form).serializeArray() 

將返回[{name:"name1",value:"value1"},{name:"name2",value:"value2"}]對。

是否有可能在形式獲得輸出

{name1:value1,name2:value2} 

,使他們更容易處理?

回答

44
var result = { }; 
$.each($('form').serializeArray(), function() { 
    result[this.name] = this.value; 
}); 

// at this stage the result object will look as expected so you could use it 
alert('name1 = ' + result.name1 + ', name2 = ' + result.name2); 

Live demo.

+6

,如果你有複選框或單選按鈕的形式,因爲它們都具有相同的名稱屬性的這種做法是行不通的。任何想法處理(除了一堆條件和手動創建一個數組)? – Hollister 2012-09-13 03:08:08

+1

這給出了一個錯誤:'SyntaxError:illegal character' – zygimantus 2017-04-28 07:45:02

+1

@zygimantus在''('form')','serializeArray()'和'})''之後有一個非法(和非打印)字符。我編輯出來了。 – 0b10011 2017-08-03 21:49:03

4
new_obj = {} 

$.each($(form).serializeArray(), function(i, obj) { new_obj[obj.name] = obj.value }) 

你的數據是new_obj

15

接受的答案的偉大工程,如果你的表格沒有複選框或單選按鈕。由於這些組都具有相同的名稱屬性,因此您需要在對象內部創建一個數組值。因此,對於類似HTML的:

<input type="checkbox" value="1" name="the-checkbox"> 
<input type="checkbox" value="1" name="the-checkbox"> 
<input type="checkbox" value="1" name="the-checkbox"> 

你會得到:代碼

{the-checkbox:['1', '2', '3']} 

This位很好地處理一切。

/*! 
* jQuery serializeObject - v0.2 - 1/20/2010 
* http://benalman.com/projects/jquery-misc-plugins/ 
* 
* Copyright (c) 2010 "Cowboy" Ben Alman 
* Dual licensed under the MIT and GPL licenses. 
* http://benalman.com/about/license/ 
*/ 

// Whereas .serializeArray() serializes a form into an array, .serializeObject() 
// serializes a form into an (arguably more useful) object. 

(function($,undefined){ 
    '$:nomunge'; // Used by YUI compressor. 

    $.fn.serializeObject = function(){ 
    var obj = {}; 

    $.each(this.serializeArray(), function(i,o){ 
     var n = o.name, 
     v = o.value; 

     obj[n] = obj[n] === undefined ? v 
      : $.isArray(obj[n]) ? obj[n].concat(v) 
      : [ obj[n], v ]; 
    }); 

    return obj; 
    }; 

})(jQuery); 

使用

$(form).serializeObject(); 
+0

這救了我!多謝,夥計!它按預期工作! – cbloss793 2017-04-28 22:15:09

30
$.fn.serializeObject = function() { 
    var o = {}; 
    var a = this.serializeArray(); 
    $.each(a, function() { 
     if (o[this.name] !== undefined) { 
      if (!o[this.name].push) { 
       o[this.name] = [o[this.name]]; 
      }  
      o[this.name].push(this.value || ''); 
     } else { 
      o[this.name] = this.value || ''; 
     } 
    }); 
    return o; 
}; 
1

這裏是Hollister的代碼中的一些現代化。

(function($,undefined){ 
    '$:nomunge'; // Used by YUI compressor. 

    $.fn.serializeObject = function(){ 
    var obj = {}, 
     names = {}; 

    $.each(this.serializeArray(), function(i,o){ 
     var n = o.name, 
     v = o.value; 

     if (n.includes('[]')) { 
      names.n = !names.n ? 1 : names.n+1; 
      var indx = names.n - 1; 
      n = n.replace('[]', '[' + indx + ']'); 
     } 

     obj[n] = obj[n] === undefined ? v 
      : $.isArray(obj[n]) ? obj[n].concat(v) 
      : [ obj[n], v ]; 
    }); 

    return obj; 
    }; 

})(jQuery); 

如果您需要字段名稱爲myvar[]複選框。

3

您可以製作自定義功能。

var complex = $(form).serialize(); // name1=value1&name2=value2 
var json = toSimpleJson(complex); // {"name1":"value1", "name2":"value2"} 

function toSimpleJson(serializedData) { 
    var ar1 = serializedData.split("&"); 
    var json = "{"; 
    for (var i = 0; i<ar1.length; i++) { 
     var ar2 = ar1[i].split("="); 
     json += i > 0 ? ", " : ""; 
     json += "\"" + ar2[0] + "\" : "; 
     json += "\"" + (ar2.length < 2 ? "" : ar2[1]) + "\""; 
    } 
    json += "}"; 
    return json; 
} 
+0

偉大的工作。這也適用於無線電領域和複選框。 – AlexioVay 2016-10-24 17:33:30

0

給您形式的ID(形式-ID)

var jsoNform = $("#form-id").serializeObject(); 

jQuery.fn.serializeObject = function() { 
    var formData = {}; 
    var formArray = this.serializeArray(); 
    for (var i = 0, n = formArray.length; i < n; ++i) 
     formData[formArray[i].name] = formArray[i].value; 
    return formData; 
}; 
相關問題