你知道 JS DOM 解析器作用域中出现这种异常的原因吗?

Do you know the reason for this anomaly in JS DOM parser scope?

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

我对这个 object 变量的范围有什么误解?

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

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

此指令创建了 obj 的克隆。由于 obj 是在循环之前定义和分配的(并且之后没有重新分配),如果您不这样做,那么您总是将相同的 object 实例放入您的数组中。您还将所有 nodeNames 信息汇总到同一个 object.

如果你不想这样做,你可以在循环中定义 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));

但是,因此,您不会像在前面的示例中那样在循环结束时获得包含每个 children 的所有信息的最终 object。