Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript forEach循环不';不更新对象值_Javascript_Loops_Foreach - Fatal编程技术网

Javascript forEach循环不';不更新对象值

Javascript forEach循环不';不更新对象值,javascript,loops,foreach,Javascript,Loops,Foreach,我尝试执行单个循环并使用每个循环值更新对象属性,但发生了意外情况: 第一个console.log打印按预期更新的day对象属性。但是,第二个打印完整对象的属性显示了day属性以及最终的forEach值 例如: data.days=[5,6] 第一个循环打印: newData.date: 5 {prop1: x, prop2: x...., date: 6} newData.date: 6 {prop1: x, prop2: x...., date: 6} 第二个循环打印: newData.d

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

第一个
console.log
打印按预期更新的
day
对象属性。但是,第二个打印完整对象的属性显示了
day
属性以及最终的
forEach

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

第一个循环打印:

newData.date: 5
{prop1: x, prop2: x...., date: 6}
newData.date: 6
{prop1: x, prop2: x...., date: 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)
})

我试图用
forEach
for
循环来创建
newData
变量,但我得到了相同的结果。

对象没有
forEach
方法(主要用于数组),但您可以使用
for(让prop-in-object)
迭代它们的属性

在您的示例中:

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

您看到的问题是由于浏览器控制台在记录对象时没有记录字符串,这是为了提供帮助。相反,它记录的是该对象的实时视图。因此,如果您记录对象并更新它,您将在控制台中看到更新的版本。但是,当您记录对象的属性时,控制台将其记录为静态字符串

你可以在这里看到:

该字符串只是作为静态字符串记录的,但对象是经过特殊处理的,具有语法高亮显示和扩展属性视图等功能

下面是一个示例,我们记录对象的静态字符串化版本以及对对象的动态引用:

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);
});
这将产生:


根据ECMAScript文档,

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

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

你的问题在这里:

...
let newData;
newData = data.data;
...
您并没有使用
newData
变量创建新对象,而是在每次迭代中引用相同的
data.data
对象。这就是为什么最后的
newData
值总是在最后一次循环迭代中设置的

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

var data={};
data.data={prop1:'x',prop2:'x'};
data.days=[5,6];
data.days.forEach(day=>{
让新数据;
newData=Object.assign({},data.data);
newData.date=天;
console.log('newData.date:'+newData.date)
console.log(newData)

});
data.days={5,6}
无效,syntaxAs Maheer Ali告诉您:forEach在数组和data上工作。days是…
newData=data。data
是通过引用复制的,您实际上在每个循环上分配相同的对象。这就是为什么您总是在最终循环中获取最后一个值…data.days被声明为空数组,并且这些值在调用循环之前被推送或拼接。事实上,正如您在第一个控制台中看到的,它在每个循环中打印正确的值。正如我所说,我尝试了“for”循环,但得到了相同的结果。控制台正确显示for或foreach对象值,甚至更新后的对象属性,但是当我想在更新后打印完整对象时,更新后的属性显示foreach对象的最后一个值,我认为这是因为newData的值在每个循环中都会更新,但不会保存。您可以在for范围之外将其声明为数组,并将每天的值推入其中。这很有意义,但现在我遇到了一个新问题:我需要在每个循环中执行post请求。它将创建一个具有不同日期值的新寄存器,但它创建的寄存器与数组长度一样多,但都是最后一个循环值。@KenRamirez我不确定到底发生了什么,但听起来您可能遇到了post请求异步的问题,所以轻微的延迟意味着它正在发送最终版本。如果在循环中使用
JSON.stringify
发送数据会怎么样?作为请求过程的一部分,它无论如何都会被字符串化。