为什么必须在for循环内还是外部定义obj变量?

时间:2020-04-27 16:37:27

标签: javascript arrays for-loop object

如果我在外部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
}

2 个答案:

答案 0 :(得分:0)

对象是引用。

owerflow

您对以上数组有什么期望?每个元素都引用相同的对象-如果该对象发生更改,则引用该对象的任何地方-也会更改。

让我们回到您的问题

在两个循环之外声明对象时,每次推入数组的对象都是该对象。如果仅在外部循环中声明它,则会为内部循环创建一个新对象,以便每次处理。

答案 1 :(得分:0)

这里发生了几件事。最大的问题是您将obj推送到newArr上,并且如果只声明一次obj,那么这仅仅是对被推送对象的引用。因此,当您第二次按下它时,您会 2个引用一个对象

出于相同的原因,当输入的第二个条目的值更改为时,它会用Mary Jenkins的数据覆盖obj中的值,但在一个对象中 >,因此newArr[0]newArr[1]都改变了,因为它们都指向同一个对象。

通过在循环内声明obj,您可以将 2个不同的对象推送到newArr数组中并获得所需的内容。