复制对象和更改日期不起作用

时间:2018-06-28 07:24:08

标签: javascript arrays mongodb loops momentjs

最后两天,我尝试使用此代码进行所有操作以更改对象中的事件日期。但是输出不好。它将所有事件的日期设置为 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' } } ]

有人可以帮我吗?

1 个答案:

答案 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));