jquery.serializeToJSON.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /**
  2. * serializeToJSON jQuery plugin
  3. * https://github.com/raphaelm22/jquery.serializeToJSON
  4. * @version: v1.3.0 (February, 2019)
  5. * @author: Raphael Nunes
  6. *
  7. * Created by Raphael Nunes on 2015-08-28.
  8. *
  9. * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
  10. */
  11. (function (factory) {
  12. if (typeof define === 'function' && define.amd) {
  13. define(['jquery'], factory);
  14. } else if (typeof module === 'object' && module.exports) {
  15. module.exports = function( root, jQuery ) {
  16. if ( jQuery === undefined ) {
  17. if ( typeof window !== 'undefined' ) {
  18. jQuery = require('jquery');
  19. }
  20. else {
  21. jQuery = require('jquery')(root);
  22. }
  23. }
  24. factory(jQuery);
  25. return jQuery;
  26. };
  27. } else {
  28. factory(jQuery);
  29. }
  30. }(function ($) {
  31. 'use strict';
  32. $.fn.serializeToJSON = function(options) {
  33. var f = {
  34. settings: $.extend(true, {}, $.fn.serializeToJSON.defaults, options),
  35. getValue: function($input) {
  36. var value = $input.val();
  37. if ($input.is(":radio")) {
  38. value = $input.filter(":checked").val() || null;
  39. }
  40. if ($input.is(":checkbox")) {
  41. value = $($input).prop('checked');
  42. }
  43. if (this.settings.parseBooleans) {
  44. var boolValue = (value + "").toLowerCase();
  45. if (boolValue === "true" || boolValue === "false") {
  46. value = boolValue === "true";
  47. }
  48. }
  49. var floatCondition = this.settings.parseFloat.condition;
  50. if (floatCondition !== undefined && (
  51. (typeof(floatCondition) === "string" && $input.is(floatCondition)) ||
  52. (typeof(floatCondition) === "function" && floatCondition($input)))) {
  53. value = this.settings.parseFloat.getInputValue($input);
  54. value = Number(value);
  55. if (this.settings.parseFloat.nanToZero && isNaN(value)){
  56. value = 0;
  57. }
  58. }
  59. return value;
  60. },
  61. createProperty: function(o, value, names, $input) {
  62. var navObj = o;
  63. for (var i = 0; i < names.length; i++) {
  64. var currentName = names[i];
  65. if (i === names.length - 1) {
  66. var isSelectMultiple = $input.is("select") && $input.prop("multiple");
  67. if (isSelectMultiple && value !== null){
  68. navObj[currentName] = new Array();
  69. if (Array.isArray(value)){
  70. $(value).each(function() {
  71. navObj[currentName].push(this);
  72. });
  73. }
  74. else{
  75. navObj[currentName].push(value);
  76. }
  77. } else {
  78. navObj[currentName] = value;
  79. }
  80. } else {
  81. var arrayKey = /\[\w+\]/g.exec(currentName);
  82. var isArray = arrayKey != null && arrayKey.length > 0;
  83. if (isArray) {
  84. currentName = currentName.substr(0, currentName.indexOf("["));
  85. if (this.settings.associativeArrays) {
  86. if (!navObj.hasOwnProperty(currentName)) {
  87. navObj[currentName] = {};
  88. }
  89. } else {
  90. if (!Array.isArray(navObj[currentName])) {
  91. navObj[currentName] = new Array();
  92. }
  93. }
  94. navObj = navObj[currentName];
  95. var keyName = arrayKey[0].replace(/[\[\]]/g, "");
  96. currentName = keyName;
  97. }
  98. if (!navObj.hasOwnProperty(currentName)) {
  99. navObj[currentName] = {};
  100. }
  101. navObj = navObj[currentName];
  102. }
  103. }
  104. },
  105. includeUncheckValues: function(selector, formAsArray){
  106. $(":radio", selector).each(function(){
  107. var isUncheckRadio = $("input[name='" + this.name + "']:radio:checked").length === 0;
  108. if (isUncheckRadio)
  109. {
  110. formAsArray.push({
  111. name: this.name,
  112. value: null
  113. });
  114. }
  115. });
  116. $("select[multiple]", selector).each(function(){
  117. if ($(this).val() === null){
  118. formAsArray.push({
  119. name: this.name,
  120. value: null
  121. });
  122. }
  123. });
  124. },
  125. serializer: function(selector) {
  126. var self = this;
  127. var formAsArray = $(selector).serializeArray();
  128. this.includeUncheckValues(selector, formAsArray);
  129. var serializedObject = {}
  130. $.each(formAsArray, function(i, item) {
  131. var $input = $(":input[name='" + item.name + "']", selector);
  132. var value = self.getValue($input);
  133. var names = item.name.split(".");
  134. self.createProperty(serializedObject, value, names, $input);
  135. });
  136. return serializedObject;
  137. }
  138. };
  139. return f.serializer(this);
  140. };
  141. $.fn.serializeToJSON.defaults = {
  142. associativeArrays: true,
  143. parseBooleans: true,
  144. parseFloat: {
  145. condition: undefined,
  146. nanToZero: true,
  147. getInputValue: function($input){
  148. return $input.val().split(",").join("");
  149. }
  150. }
  151. };
  152. }));