【问题标题】:copy object and change date won't work复制对象和更改日期不起作用
【发布时间】:2018-12-07 04:32:24
【问题描述】:

最近两天我尝试了这段代码中的所有方法来更改对象中的事件日期。但是输出并不好。它将所有事件日期设置为 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' } } ]

谁能帮帮我。

【问题讨论】:

  • 将项目推送到数组中的特定索引

标签: javascript arrays mongodb loops momentjs


【解决方案1】:

问题是

for (var i = 0; i < data.when.singledates.length; i++) {
  var ret = data;
  // mutate ret
  // push ret to array

data 是大的单一数据对象——它不是原始数据,它是一个对象,因此您可能会将其视为对内存位置的引用,而不是在将其分配给另一个变量时其值被复制的东西。当你改变 ret 时,你改变了原始对象 - 你在每次迭代中都没有 copy,所以最终的数组由 3 个元素组成,都引用同一个对象 (@987654324 @),它已被多次变异(并且其最后一次变异将date 属性分配给2018-06-09T00:00:00.000Z

如果您想将 单独 对象推送到您的 events 数组,请在推送之前在每次迭代中深度克隆 data。快速的方法是序列化和反序列化,因为data 中的嵌套值最终都是原语:

var ret = JSON.parse(JSON.stringify(data));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多