javascript - 为什么 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))
解决方案
这里发生了几件事。最大的问题是你推送obj
,newArr
如果你只声明obj
一次,那么它只是对被推送对象的引用。因此,当您第二次推送它时,您对一个 object有2 个引用。
出于同样的原因,当您的值更改为输入中的第二个条目时,它会obj
用 Mary Jenkins 的数据覆盖其中的值,但这会在一个对象中发生变化,因此两者都会发生变化,newArr[0]
因为newArr[1]
它们都指向同一个对象.
通过obj
在循环内部声明,您将把2 个不同的对象推送到newArr
数组上并得到您想要的。
推荐阅读
- python - NetworkX - 保持边缘秩序
- php - 实时过滤多个分类查询
- python - 在 pytorch 中,为什么 sum(tensor) 有时会返回错误结果而不是 torch.sum(tensor)?
- mysql - MySql date = CURDATE() 不适用于 2 LIKE 条件
- javascript - 基于标签的可变背景颜色 Chart.js
- matlab - 将代码转换为 xcorr 函数的 hdl 时出现 MATLAB 编码器错误
- java - 为什么即使使用 @JsonIgnoreProperties 在使用 jackson 时也会出现 stackoverflow 错误
- java - Java 仅在有人讲话时录制音频
- python - Django 传递参数
- xamarin.forms - 部署时有什么方法可以为 APK 设置密码?