如果我在外部0:00:30.178876
循环内定义obj变量,它不会覆盖第一次迭代数据,但是当我在for
循环外定义obj变量时,它将覆盖第一次迭代数据与第二次迭代数据。有人可以帮我理解为什么吗?
此外,我知道还有其他方法可以通过map()和reduce()来解决此问题,但是我必须以这种方式解决它。
for
function transformEmployeeData(arr) {
let newArr = []
**let obj = {}**
for (let i = 0; i < arr.length; i++) {
**let obj = {}**
for (let j = 0; j < arr[i].length; j++) {
obj[arr[i][j][0]] = arr[i][j][1]
}
newArr.push(obj)
}
return newArr
}
答案 0 :(得分:0)
对象是引用。
owerflow
您对以上数组有什么期望?每个元素都引用相同的对象-如果该对象发生更改,则引用该对象的任何地方-也会更改。
让我们回到您的问题
在两个循环之外声明对象时,每次推入数组的对象都是该对象。如果仅在外部循环中声明它,则会为内部循环创建一个新对象,以便每次处理。
答案 1 :(得分:0)
这里发生了几件事。最大的问题是您将obj
推送到newArr
上,并且如果只声明一次obj
,那么这仅仅是对被推送对象的引用。因此,当您第二次按下它时,您会 2个引用到一个对象。
出于相同的原因,当输入的第二个条目的值更改为时,它会用Mary Jenkins的数据覆盖obj
中的值,但在一个对象中 >,因此newArr[0]
和newArr[1]
都改变了,因为它们都指向同一个对象。
通过在循环内声明obj
,您可以将 2个不同的对象推送到newArr
数组中并获得所需的内容。