我想使用JavaScript和jQuery从html元素创建一个对象。
我想要创建的对象是
{
array:[{infraStructureType: 'value', hostId: 'value'}, {infraStructureType: 'value', hostId: 'value'}]
}
所以我创建上述对象的代码是
var obj = {}, dataObj = {compareESX: []};
$('.checkBox:checked').each(function () {
obj.infraStructureType = $(event.target).attr('hostId');
obj.hostId = $(event.target).attr('infrastructureType');
console.log(obj);
dataObj.compareESX.push(obj);
console.log(dataObj);
});
在上面的代码" console.log(obj)"给出正确的输出但是,当我把它推入数组" dataObj.compareESX" 只有最后一个' obj'的信息。每个循环执行的次数被推动。
答案 0 :(得分:0)
JS使用Call by reference方法。因此,当更新obj时,它会更改所有值。你需要做深拷贝。使用这个
dataObj.compareESX.push(JSON.parse(JSON.stringify(obj)));
答案 1 :(得分:0)
试试这个:FIDDLE 我们需要再次定义obj以清除以前的值。
var dataObj = {compareESX: []};
$('.checkBox:checked').each(function (e) {
var obj = {};
obj.infraStructureType = $(this).attr('hostId');
obj.hostId = $(this).attr('infrastructureType');
//console.log(obj);
dataObj.compareESX.push(obj);
//console.log(dataObj);
});
console.log(dataObj);
答案 2 :(得分:-1)
您必须将对象定义var obj = {}
放在的each
循环中。现在,您正在为循环中的每个条目使用相同的对象。相反,您应该为循环的每个复选框创建一个新对象。
var dataObj = {compareESX: []};
$('.checkBox:checked').each(function () {
var obj = {};
obj.infraStructureType = $(event.target).attr('hostId');
obj.hostId = $(event.target).attr('infrastructureType');
console.log(obj);
dataObj.compareESX.push(obj);
console.log(dataObj);
});