2014-07-23 24 views
0

我有一段代码来创建对象文字数组。该数组由另外两个字符串数组创建,一个将成为对象字面值colHeads,另一个数组将为数据dataArr为同一对象文字添加不同的值javascript

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

在你的第一个代码中,什么是'colDatas' – tyh

+0

它只是另一个字符串数组,像'colDatas [0] =“John A. Smith,Joan B. Jones”' – Casper

回答

2

首先,您的循环访问相同dataArr指数,它应该使用j

tempObj[colHeads[i]] = dataArr[j]; 

其次,你是不是建设新tempObjs每个LO op,因此每个项目索引共享相同的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,而不是每一行,你应该做的。现在

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对象的方式,它要求你将它们分割为每一个循环可以变得相当昂贵,我建议你找到另一种方式来存储,以便可以更好地优化。

+0

对不起,我实际上使用了'tempObj [colHeads [i]] = dataArr [j];',我复制了错误的代码来显示 – Casper

+0

我做了更新,还有一步。 – Lochemage

+0

谢谢...... – Casper

0

在循环中创建新对象(之前准备数组),就像这样:

for (var i=0; i<colHeads.length; ++i) { 
    var tmpObj = {}; 
    tmpObj.name = colHeads[i]; 
    tmpObj.state = colDatas[i] 
    result.push(tmpObj); 
} 
相关问题