jquery.serializeToJSON.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /**
  2. * serializeToJSON jQuery plugin
  3. * https://github.com/raphaelm22/jquery.serializeToJSON
  4. * @version: v1.2.2 (November, 2017)
  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($) {
  12. "use strict";
  13. $.fn.serializeToJSON = function(options) {
  14. var f = {
  15. settings: $.extend(true, {}, $.fn.serializeToJSON.defaults, options),
  16. getValue: function($input) {
  17. var value = $input.val();
  18. if ($input.is(":radio")) {
  19. value = $input.filter(":checked").val() || null;
  20. }
  21. if ($input.is(":checkbox")) {
  22. value = $($input).prop('checked');
  23. }
  24. if (this.settings.parseBooleans) {
  25. var boolValue = (value + "").toLowerCase();
  26. if (boolValue === "true" || boolValue === "false") {
  27. value = boolValue === "true";
  28. }
  29. }
  30. var floatCondition = this.settings.parseFloat.condition;
  31. if (floatCondition !== undefined && (
  32. (typeof(floatCondition) === "string" && $input.is(floatCondition)) ||
  33. (typeof(floatCondition) === "function" && floatCondition($input)))) {
  34. value = this.settings.parseFloat.getInputValue($input);
  35. value = Number(value);
  36. if (this.settings.parseFloat.nanToZero && isNaN(value)){
  37. value = 0;
  38. }
  39. }
  40. return value;
  41. },
  42. createProperty: function(o, value, names, $input) {
  43. var navObj = o;
  44. for (var i = 0; i < names.length; i++) {
  45. var currentName = names[i];
  46. if (i === names.length - 1) {
  47. var isSelectMultiple = $input.is("select") && $input.prop("multiple");
  48. if (isSelectMultiple && value !== null){
  49. navObj[currentName] = new Array();
  50. if (Array.isArray(value)){
  51. $(value).each(function() {
  52. navObj[currentName].push(this);
  53. });
  54. }
  55. else{
  56. navObj[currentName].push(value);
  57. }
  58. } else {
  59. navObj[currentName] = value;
  60. }
  61. } else {
  62. var arrayKey = /\[\w+\]/g.exec(currentName);
  63. var isArray = arrayKey != null && arrayKey.length > 0;
  64. if (isArray) {
  65. currentName = currentName.substr(0, currentName.indexOf("["));
  66. if (this.settings.associativeArrays) {
  67. if (!navObj.hasOwnProperty(currentName)) {
  68. navObj[currentName] = {};
  69. }
  70. } else {
  71. if (!Array.isArray(navObj[currentName])) {
  72. navObj[currentName] = new Array();
  73. }
  74. }
  75. navObj = navObj[currentName];
  76. var keyName = arrayKey[0].replace(/[\[\]]/g, "");
  77. currentName = keyName;
  78. }
  79. if (!navObj.hasOwnProperty(currentName)) {
  80. navObj[currentName] = {};
  81. }
  82. navObj = navObj[currentName];
  83. }
  84. }
  85. },
  86. includeUncheckValues: function(selector, formAsArray){
  87. $(":radio", selector).each(function(){
  88. var isUncheckRadio = $("input[name='" + this.name + "']:radio:checked").length === 0;
  89. if (isUncheckRadio)
  90. {
  91. formAsArray.push({
  92. name: this.name,
  93. value: null
  94. });
  95. }
  96. });
  97. $("select[multiple]", selector).each(function(){
  98. if ($(this).val() === null){
  99. formAsArray.push({
  100. name: this.name,
  101. value: null
  102. });
  103. }
  104. });
  105. },
  106. serializer: function(selector) {
  107. var self = this;
  108. var formAsArray = $(selector).serializeArray();
  109. this.includeUncheckValues(selector, formAsArray);
  110. var serializedObject = {}
  111. $.each(formAsArray, function(i, item) {
  112. var $input = $(":input[name='" + item.name + "']", selector);
  113. var value = self.getValue($input);
  114. var names = item.name.split(".");
  115. self.createProperty(serializedObject, value, names, $input);
  116. });
  117. return serializedObject;
  118. }
  119. };
  120. return f.serializer(this);
  121. };
  122. $.fn.serializeToJSON.defaults = {
  123. associativeArrays: true,
  124. parseBooleans: true,
  125. parseFloat: {
  126. condition: undefined,
  127. nanToZero: true,
  128. getInputValue: function($input){
  129. return $input.val().split(",").join("");
  130. }
  131. }
  132. };
  133. })(jQuery);