最后两天,我尝试使用此代码进行所有操作以更改对象中的事件日期。但是输出不好。它将所有事件的日期设置为 2018-06-09。这是代码
var ObjectId = require('mongodb').ObjectID;
var moment = require('moment');
function insert(data) {
var events = [];
if (data.when.singledates.length > 0) {
for (var i = 0; i < data.when.singledates.length; i++) {
var ret = data;
ret['event'] = {
"date": moment.utc(ret.when.singledates[i].date, "DD/MM/YYYY").toISOString()
}
events.push(ret);
console.log(ret);
}
insertevents(data, events);
}
}
function insertevents(data, events) {
console.log(events);
}
var data = {
"_id" : ObjectId("5b33eb86d6687e7a4b94286e"),
"when" : {
"singledates" : [
{
"endtime" : "21:30:00",
"date" : "02/06/2018",
"status" : null,
"starttime" : "19:00:00",
"extrainformation" : null
},
{
"endtime" : "21:30:00",
"date" : "07/06/2018",
"status" : null,
"starttime" : "19:00:00",
"extrainformation" : null
},
{
"endtime" : "21:30:00",
"date" : "09/06/2018",
"status" : null,
"starttime" : "19:00:00",
"extrainformation" : null
},
],
"datepatterns" : []
}
}
insert(data);
console.log(ret)的输出如下:
{ _id: 5b33eb86d6687e7a4b94286e,
when:
{ singledates: [ [Object], [Object], [Object] ],
datepatterns: [] },
event: { date: '2018-06-02T00:00:00.000Z' } }
{ _id: 5b33eb86d6687e7a4b94286e,
when:
{ singledates: [ [Object], [Object], [Object] ],
datepatterns: [] },
event: { date: '2018-06-07T00:00:00.000Z' } }
{ _id: 5b33eb86d6687e7a4b94286e,
when:
{ singledates: [ [Object], [Object], [Object] ],
datepatterns: [] },
event: { date: '2018-06-09T00:00:00.000Z' } }
因此您可以看到活动日期设置都不错。但是当我打印出console.log(events);日期设置不好。全部显示相同的日期
[ { _id: 5b33eb86d6687e7a4b94286e,
when: { singledates: [Array], datepatterns: [] },
event: { date: '2018-06-09T00:00:00.000Z' } },
{ _id: 5b33eb86d6687e7a4b94286e,
when: { singledates: [Array], datepatterns: [] },
event: { date: '2018-06-09T00:00:00.000Z' } },
{ _id: 5b33eb86d6687e7a4b94286e,
when: { singledates: [Array], datepatterns: [] },
event: { date: '2018-06-09T00:00:00.000Z' } } ]
有人可以帮我吗?
答案 0 :(得分:0)
问题是
for (var i = 0; i < data.when.singledates.length; i++) {
var ret = data;
// mutate ret
// push ret to array
data
是单个大数据对象-它不是原始数据,而是一个对象,因此您可以将其视为对内存位置的引用,而不是将其赋值给另一个变量时会复制其值的东西。对ret
进行突变时,就对原始对象进行了突变-每次迭代都没有 copy ,因此最终数组由3个元素组成,所有元素都引用同一个对象( data
),该变量已被多次突变(其最后一个突变将date
属性分配给2018-06-09T00:00:00.000Z
)
如果您想将 separate 对象推送到events
数组中,请在每次迭代之前对副本进行深克隆data
。快速的方法是序列化和反序列化,这将起作用,因为data
中的嵌套值最终都是原语:
var ret = JSON.parse(JSON.stringify(data));