我有一段代码来创建一个对象文字数组。该数组是从另外两个字符串数组创建的,一个将成为对象文字colHeads
,另一个数组将是数据dataArr
。
colHeads = [name, state]
dataArr = [John A. Smith,Joan B. Jones]
var temp = [];
var tempObj = {};
for (var i=0; i<colHeads.length; ++i) { // columns
var dataArr = colDatas[i].split(",");
for (var j = 0; j < dataArr.length; j++) { // data
tempObj[colHeads[i]] = dataArr[j];
}
temp.push(tempObj);
}
最终数组应如下所示:
var data = [
{name: 'John A. Smith', state: 'CA'},
{name: 'Joan B. Jones', state: 'NY'}
];
这里的问题是根据这一行tempObj[colHeads[i]] = dataArr[0];
对象文字将替换为两个数组中的最后一个条目,使得结果如下所示:
var data = [
{name: 'Joan B. Jones', state: 'NY'},
{name: 'Joan B. Jones', state: 'NY'}
];
我是javascript的新手,所以我不太了解语法
答案 0 :(得分:2)
首先,您的循环正在访问相同的dataArr索引,它应该使用j
tempObj[colHeads[i]] = dataArr[j];
其次,你没有为每个循环构造新的tempObjs,所以每个项目索引共享相同的tempObj,最终会留下一个完全相同的对象列表。
到目前为止,您的代码应该看起来像这样:
var temp = [];
for (var i=0; i<colHeads.length; ++i) { // columns
var tempObj = {};
var dataArr = colDatas[i].split(",");
for (var j = 0; j < dataArr.length; j++) { // data
tempObj[colHeads[j]] = dataArr[j];
}
temp.push(tempObj);
}
最后,您只为每列创建一个tempObj,而不是像您应该做的那样为每一行创建一个tempObj。
var temp = [];
var rowCount = colDatas[0].split(',').length;
for (var i = 0; i < rowCount; ++i) { // rows first
var tempObj = {};
for (var j = 0; j < colHeads.length; ++j) { // now columns
tempObj[colheads[j]] = colDatas[j].split(',')[i];
}
temp.push(tempObj);
}
现在,由于你的colDatas对象的设置方式,它需要你为每个循环拆分它们,这可能会变得非常昂贵,我建议你找到另一种存储方式,以便更好地进行优化。
答案 1 :(得分:0)
在循环中创建新对象(在它之前准备数组),如下所示:
for (var i=0; i<colHeads.length; ++i) {
var tmpObj = {};
tmpObj.name = colHeads[i];
tmpObj.state = colDatas[i]
result.push(tmpObj);
}