【问题标题】:Why does the obj variable have to be defined inside the for loop vs outside?为什么 obj 变量必须在 for 循环内部而不是外部定义?
【发布时间】:2020-04-27 16:37:27
【问题描述】:

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

另外,我知道还有其他方法可以用 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)) 

【问题讨论】:

  • 变量声明无关紧要,但您需要在每次迭代时创建一个新对象 (= {})。 push 不会将对象的内容复制到数组中。如果不重新初始化对象,所有数组索引都引用 same 对象实例。

标签: javascript arrays for-loop object


【解决方案1】:

对象是引用。

var objectCollection = [];
var o = {}

o.foo = 1;
objectCollection.push(o);

o.foo = 2;
objectCollection.push(o);


console.log(objectCollection)    //All 2 elemets are the same object

objectCollection[0].foo = 100;
console.log(objectCollection);

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

让我们回到你的问题

当您在两个循环之外声明对象时,每次推送到数组的都是同一个对象。如果您在外循环内声明它,则每次都会为内循环创建一个新对象以进行处理。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 2020-01-04
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多