javascript总是推送同一个对象

时间:2018-04-06 22:39:59

标签: javascript arrays push

你知道为什么这段代码总是添加最后一个对象吗? 因为我用了

var obj = {} 

var newBase = Object.assign({}, baseJson)

但代码总是使用相同的引用?

module.exports = (csv, baseJson) => {

var lines=csv.split("\n");

var result = [];

var headers=lines[0].split(";");
for(var i=1;i<lines.length;i++){
    var obj = {};
    var newBase = Object.assign({}, baseJson);
    obj["case"] = "Scenario";
    obj["request"] = newBase;
    obj["response"] = {
        responseCode: "5",
        actionCode: "0",
        approvalCode: "98765X",
    }
    var currentline=lines[i].split(";");
    var responseTags = ["responseCode", "actionCode", "approvalCode"];      
    for(var j=0;j<headers.length;j++){

        headers[j] = headers[j].replace('\r','');
        currentline[j] = currentline[j].replace('\r','')
        if (headers[j] == "Scenario") {
            obj["case"] = currentline[j];
        }
        else if (responseTags.indexOf(headers[j]) > -1 ){
            obj["response"][headers[j]] = currentline[j];
        }
        else {
            saveValue(obj["request"], headers[j], currentline[j]);
        }
    }
    result.push(obj);

}

我尝试了几乎所有东西,但我无法创建新对象。它使用相同的参考。此代码位于node.js. 谢谢

2 个答案:

答案 0 :(得分:1)

Object.assign可能无法克隆内部对象,它只需要相同的引用,尝试stringify并解析它。

 var newBase = JSON.parse(JSON.stringify(baseJson));

请参阅了解更多:What is the most efficient way to deep clone an object in JavaScript?

答案 1 :(得分:0)

这是因为Javascript var的范围是函数,而不是块。在您的代码中有效地obj在循环之外声明,并且它的属性发生了变异。

let solve the problem

for(var i=1;i<lines.length;i++){
  let obj = {};
  ...
  result.push(obj);
}