скопировать объект и изменить дату не получится - PullRequest
0 голосов
/ 28 июня 2018

Последние два дня я попробовал все в этом коде, чтобы изменить дату события в объекте. Но вывод не хороший. Он устанавливает дату всех событий 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 голосов
/ 28 июня 2018

Проблема

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

data - это большой отдельный объект данных - это не примитив, это объект, поэтому вы можете рассматривать его как ссылку на ячейку памяти, а не как нечто, чье значение копируется, когда вы присваиваете его другой переменной. Когда вы изменяете ret, вы изменяете исходный объект - у вас нет копии на каждой итерации, поэтому окончательный массив состоит из 3 элементов, каждый из которых ссылается на один и тот же объект (data ), который был мутирован несколько раз (и последней мутацией которого присвоено свойство date для 2018-06-09T00:00:00.000Z)

Если вы хотите помещать отдельные объекты в ваш массив events, глубокий клон data на каждой итерации перед отправкой. Быстрый способ - сериализация и десериализация, которые будут работать, поскольку вложенные значения в data в конечном итоге являются примитивами:

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