首页 > 解决方案 > 为什么 obj 变量必须在 for 循环内部而不是外部定义?

问题描述

如果我在外for循环内定义 obj 变量,它不会覆盖第一次迭代数据,但是当我在循环外定义 obj 变量时for,它会用第二次迭代数据覆盖第一次迭代数据。有人可以帮我理解为什么吗?

另外,我知道还有其他方法可以用 map() 和 reduce() 来解决这个问题,但我必须以这种方式解决它。

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
}

var input = [
[
    ['firstName', 'Joe'],
    ['lastName', 'Blow'],
    ['age', 42],
    ['role', 'clerk']
],
[
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
]
];

console.log(transformEmployeeData(input)) 

标签: javascriptarraysfor-loopobject

解决方案


这里发生了几件事。最大的问题是你推送objnewArr如果你只声明obj一次,那么它只是对被推送对象的引用。因此,当您第二次推送它时,您对一个 object有2 个引用

出于同样的原因,当您的值更改为输入中的第二个条目时,它会obj用 Mary Jenkins 的数据覆盖其中的值,但这会在一个对象中发生变化,因此两者都会发生变化,newArr[0]因为newArr[1]它们都指向同一个对象.

通过obj在循环内部声明,您将把2 个不同的对象推送到newArr数组上并得到您想要的。


推荐阅读