【问题标题】:Formatting JavaScript Object from HTML Form using serializeJSON使用 serializeJSON 从 HTML 表单格式化 JavaScript 对象
【发布时间】:2018-06-01 14:48:14
【问题描述】:

我在将数据从我的 HTML 表单中取出并转换为我要发送到的服务器所需的正确 JSON 格式时遇到了一些问题。我已经尝试按照我找到的将数据提取和格式化为 JavaScript 对象的指南进行操作,但我无法获得与我需要发送的内容相匹配的输出。

我已经能够获得我需要的问题键以及它的正确值,但无法添加正确的标签。

电流输出:

{"Question1":"Yes",
"Question2":"No",
"Question3":"1",
"Question4":"Female"}

所需输出:

{
"Key":"Question1",
"Value":"Yes"
 }, {
"Key":"Question2",
"Value":"No"
 }, {
"Key":"Question1",
"Value":"No"
 }, {
 "Key":"Question4",
 "Value":"Female"
 }

(我包含了 serializeJSON 插件的脚本以使 sn-p 工作)

$(function(){
var $select = $(".1-100");
for (i=1;i<=100;i++){
    $select.append($('<option></option>').val(i).html(i))
 }
});	

function submitForm () { 


var result = [];
$.each($('form').serializeArray(), function(i,field){
result.push({"Key": field.name, "Value":field.value})
 
});
  
var formData = JSON.stringify($(result));	
	console.log(formData);
};
  
	
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="survey" method="post">
	<div class="form-group">
 	<div class="col-sm-3 selectContainer">
		
	 <label class="control-label" >First Question</label>
  		<select class="form-control" name="QuestionKey1">
    		<option name="Value" value="Yes" selected>Yes</option>
    		<option name="Value" value="No">No</option>
  		</select>
	</div>	
		
	<div class="col-sm-3 selectContainer">	
  		<label class="control-label">Second Question</label>
  			<select class="form-control" name="QuestionKey2">
    			<option name="Value" value="Yes">Yes</option>
    			<option name="Value" value="No" selected>No</option>
 			 </select>
		</div>
				
	<div class="col-sm-2 selectContainer">
		  <label class="control-label">Third Question</label>	
			<select class="form-control 1-100" id="age" name="QuestionKey3"></select>
    </div>
		
		<div class="col-sm-2">
		 <label class="control-label">Fourth Question</label>	
			 <label class="radio-inline">
			 	<input type="radio" name="QuestionKey4" value="Female" />Female
			  </label>
			  <label class="radio-inline">
				 <input type="radio" name="QuestionKey4" value="Male" />Male
			  </label>	
		
		</div>	
		</div>				
	<input value="Submit" type="button" onclick="submitForm()">	
</form>

任何提示或建议将不胜感激。谢谢你。

编辑 - 遵循发送的示例之一后,我的输出结果如下所示:

{"0":{"Key":"QuestionKey1","Value":"Yes"},"1": 
{"Key":"QuestionKey2","Value":"No"},"2": 
{"Key":"QuestionKey3","Value":"1"},"3": 
{"Key":"QuestionKey4","Value":"Male"},"length":4}

我还修改了我的 sn-p 以反映让我走到这一步的变化。

【问题讨论】:

    标签: javascript jquery html json


    【解决方案1】:

    尝试这样的事情:(不需要那个插件),使用 http://api.jquery.com/serializeArray/

    var result = [];    
    $.each($('form').serializeArray(), function(i, field){
        result.push({"Key": field.name, "Value":field.value})
    });
    

    如果需要,最后以字符串格式调用 JSON.stringify

    【讨论】:

    • 这个回复给了我几乎我正在寻找的东西,我只是想知道你是否知道我将如何摆脱伴随输出而来的编号和长度?我在 serializeArray 的文档和示例中没有看到它,也许我错过了一步?我编辑了我的帖子以反映这些变化。
    • 在纯 javascript 对象上调用 JSON.stringify 而不将其转换为 jquery 对象。 IE。 JSON.stringify(结果)
    • 这个解决方案对我很有用。非常感谢您对此提供的帮助。
    【解决方案2】:

    首先请注意on* 事件属性已过时。您应该改用不显眼的事件处理程序。此外,在处理表单时,您应该挂钩到form 元素的submit 事件,而不是提交按钮的click。这是出于可访问性目的。

    关于您的实际问题,您不需要使用 serializeJSON 插件。 jQuery 自己的serializeArray() 方法可以让您接近所需的数据格式,但是它返回带有namevalue 键的对象数组,而不是由输入本身的名称键入的单个对象。要解决这个问题,您可以遍历数组,如下所示:

    $(function() {
      var $select = $(".1-100");
      for (i = 1; i <= 100; i++) {
        $select.append($('<option></option>').val(i).html(i))
      }
    
      $('#survey').on('submit', function(e) {
        e.preventDefault();
        
        var obj = {};
        $(this).serializeArray().forEach(function(arr) {
          obj[arr.name] = arr.value;
        })
        
        console.log(obj);
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <form id="survey" method="post">
      <div class="form-group">
        <div class="col-sm-3 selectContainer">
          <label class="control-label">First Question</label>
          <select class="form-control" name="QuestionKey1">
            <option name="Value" value="Yes" selected>Yes</option>
            <option name="Value" value="No">No</option>
          </select>
        </div>
        <div class="col-sm-3 selectContainer">
          <label class="control-label">Second Question</label>
          <select class="form-control" name="QuestionKey2">
            <option name="Value" value="Yes">Yes</option>
            <option name="Value" value="No" selected>No</option>
          </select>
        </div>
        <div class="col-sm-2 selectContainer">
          <label class="control-label">Third Question</label>
          <select class="form-control 1-100" id="age" name="QuestionKey3"></select>
        </div>
    
        <div class="col-sm-2">
          <label class="control-label">Fourth Question</label>
          <label class="radio-inline">
            <input type="radio" name="QuestionKey4" value="Female" />Female
          </label>
          <label class="radio-inline">
            <input type="radio" name="QuestionKey4" value="Male" />Male
          </label>
        </div>
      </div>
      <button type="submit">Submit</button>
    </form>

    【讨论】:

    • 感谢有关 onclick 事件的信息,我没有意识到它们已经过时了。我将从现在开始修改我的表格以符合这个标准。 serializeArray() 可以很好地格式化我需要的格式,而且你不需要那个插件是对的。感谢您的宝贵时间。
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多