您是否知道JS DOM解析器范围中此异常的原因?

时间:2018-08-16 16:22:32

标签: javascript xml domparser

下午好。尽管登录到控制台会产生所需的结果...记录最终数组显示只有最后一个子项已被推入循环。

我对该对象变量的范围有什么误解?

let arr = [];
let obj = {};
parser = new DOMParser();
xml = parser.parseFromString(xml,"text/xml");
let root = xml.children[0];
for (var i = 0; i < root.children.length; i++) {
  let child = root.children[i].children;
  for (var i2 = 0; i2 < task.length; i2++) {
    obj[child[i2].nodeName] = child[i2].textContent;
  };
  // arr[i] = JSON.parse(JSON.stringify(obj)); // WHY IS THIS NECESSARY???
  arr.push(obj); 
  console.log(JSON.stringify(obj)); // LOGS EACH CHILD CORRECTLY; FINAL ARRAY DOES NOT!
};
console.log(JSON. stringify(arr)); // RESULT IS THE LAST NODE NAME/VALUE REPEATED i TIMES

1 个答案:

答案 0 :(得分:0)

  

JSON.parse(JSON.stringify(obj));

此指令创建obj的副本。由于obj是在循环之前定义和分配的(而不是在循环之后重新分配的),因此,如果不这样做,则总是将同一对象实例放入数组中。您还将在同一对象中汇总所有nodeNames信息。

如果您不想这样做,可以在循环内定义obj

let arr = [];
parser = new DOMParser();
xml = parser.parseFromString(xml,"text/xml");
let root = xml.children[0];

for (let i = 0; i < root.children.length; i++) {
    let obj = {};
    let child = root.children[i].children;
    for (var i2 = 0; i2 < task.length; i2++) {
        obj[child[i2].nodeName] = child[i2].textContent;
    };
    arr.push(obj); 
    console.log(obj);
};
console.log(JSON.stringify(arr));

但是,其结果是,您将无法像之前示例中那样在循环末尾获得包含有关每个子代的所有信息的最终对象。