forEach循环不会更新对象值

时间:2019-05-23 15:01:28

标签: javascript loops foreach

我正在尝试执行一个循环并使用每个循环值更新一个对象属性,但是发生了意外情况:

第一个console.log打印day对象属性,该属性已按预期更新。但是,第二个打印完整的对象,显示了day属性,其值为 final forEach值。

示例: data.days = [ 5, 6 ]

第一次循环打印:

newData.date: 5
{prop1: x, prop2: x...., date: 6}

第二个循环打印:

newData.date: 6
{prop1: x, prop2: x...., date: 6}

这是我的代码:

data.days.forEach(day => {
    let newData;
    newData = data.data;
    newData.date = day;
    console.log('newData.date: ' + newData.date)
    console.log(newData)
})

我尝试从newDataforEach循环中创建for变量,但结果相同。

4 个答案:

答案 0 :(得分:1)

您看到的问题是由于以下事实引起的:浏览器控制台在试图记录对象时没有尝试记录字符串,这很有帮助。相反,它正在记录该对象的实时视图。因此,如果您记录该对象然后对其进行更新,您将在控制台中看到更新的版本。但是,当您记录对象的属性时,控制台会将其记录为静态字符串。

您可以在这里看到此内容:

enter image description here

该字符串只是作为静态字符串记录,但是该对象经过特殊处理,并带有语法突出显示和扩展属性视图等。

在此示例中,我们记录了对象的静态字符串化版本以及对对象的动态引用:

let days = [5, 6];
let newData = {};

days.forEach(day => {
    newData.date = day;
    console.log('newData.date: ' + newData.date);
    console.log(JSON.stringify(newData));
    console.log(newData);
});

这将产生:

enter image description here

答案 1 :(得分:1)

您的问题在这里:

line 51, in EnemySpawn
    enemyspawn = EnemySpawn()
TypeError: 'Thread' object is not callable

您不是在使用... let newData; newData = data.data; ... 变量创建新对象,而是在每次迭代中仅将相同的newData对象引用到其中。这就是为什么最终的data.data值始终是上一次循环迭代中设置的值的原因。

如果每个循环都需要一个新的不同对象,则需要(深度)克隆/复制newData而不是仅仅引用它:

data.data

  

注意:Object.assign会进行对象的浅表复制,如果需要对对象进行深表复制,则需要采取其他措施。

答案 2 :(得分:0)

对象没有forEach方法(主要用于数组),但是您可以使用for (let prop in object)对其对象进行迭代。

在您的示例中:

for (let day in data.days) {
    // Do your stuff
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

答案 3 :(得分:0)

根据ECMAScript文档, a link

在22.1.3.12 Array.prototype.forEach(callbackfn [,thisArg])

  

callbackfn应该是一个接受三个参数的函数。 forEach对数组中存在的每个元素按升序调用一次callbackfn。 callbackfn仅针对实际存在的数组元素进行调用;不会因为缺少数组元素而调用它。