为同一个对象文字javascript添加不同的值

时间:2014-07-23 19:30:04

标签: javascript arrays object-literal

我有一段代码来创建一个对象文字数组。该数组是从另外两个字符串数组创建的,一个将成为对象文字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的新手,所以我不太了解语法

2 个答案:

答案 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);
}