如何用循环构建一个json对象?

我正在尝试遍历许多项目,并创建一个json对象。 每个循环应该是对象上的一个新项目,但我遇到了一些问题。 似乎只添加了一组项目,而不是多项。

这是我的代码:

jsonObj = {} rows.each(function (index) { jsonObj["id"] = $this.find('.elementOne').val(); jsonObj["name"] = $this.find('.elementTwo').text(); }); 

这是我的json的样子:

 { id: "3" name: "Stuff" }, 

这是我想要做的:

 { id: "1" name: "Stuff" }, { id: "2" name: "Stuff" }, { id: "3" name: "Stuff" } 

这里没有JSON。 请不要混淆:

  • JavaScript对象(数据结构)
  • JavaScript对象文字(用于创建此类数据结构的代码)
  • JSON(基于对象文字表示法子集的数据格式)

如果需要有序的对象列表(或任何其他类型的JavaScript数据结构),请使用数组。 数组有push方法。

 var myData = []; rows.each(function (index) { var obj = { id: $this.find('.elementOne').val(), name: $this.find('.elementTwo').text() }; myData.push(obj); }); 

您重写对象,而不是每次迭代都添加一个新值。

修复了使用数组的代码

 jsonObj = []; rows.each(function(index) { jsonObj.push({ 'id': $this.find('.elementOne').val(), 'name': $this.find('.elementTwo').text() }); });​ 

你想要的是一个对象数组。 当您尝试多次在同一对象上写入相同的属性时,它会被覆盖,这就是为什么您看到idname包含循环的最后一次迭代的值。

虽然你还没有用jQuery标记这个问题,但它确实看起来像jQuery,所以这是一个解决方案:

我已经冒昧地将$this改为this因为$this似乎是指每次迭代中的同一个对象,现在你可能想要的是(methinks)

 var myArray = rows.map(function() { return { id: $(this).find('.elementOne').val(), name: $(this).find('.elementTwo').text() }; }); 

这是因为您每次只是覆盖对象, idname的相同属性。 您需要为每个子对象创建一个子对象,然后将其推入主对象(我已转换为数组,因为它是非关联的)。

 var jsonObj = [] rows.each(function (index) { var temp_obj = {}; temp_obj["id"] = $this.find('.elementOne').val(); temp_obj["name"] = $this.find('.elementTwo').text(); jsonObj.push(temp_obj); }); 

[编辑] – 正如Mark Eirich的回答所示, temp_obj是不必要的 – 你可以推送一个匿名对象,但我定义了temp_obj只是为了清楚地说明发生了什么。

另请阅读Quentin的非常好的观点:JavaScript对象和JSON之间常见的混淆。

 var jsonObj = []; rows.each(function(index) { jsonObj.push({ id: $this.find('.elementOne').val(), name: $this.find('.elementTwo').text() }); }); 

你可以用jquery这样做。 该函数将期望输入类型的表单元素。 它将迭代到传递的表单将收集每个输入的名称和值,它将创建一个像json对象

Exmple:

HTML

 

使用Javascript

 function buildObject(form) { var jsonObject = [], tempObj = {}; $(form).find("input:not(input[type='submit'])").each(function() { tempObj[$(this).attr("name")] = $(this).val(); }); jsonObject.push(tempObj); return jsonObject[0]; } buildObject($("#myForm")); //Will produce jsonObj = { field1 : "I a value of field 1", field2 : "I am value of field 2" }