Использование массива объектов в JavaScript - PullRequest
0 голосов
/ 18 июня 2020

У меня есть следующие JavaScript, и я хотел бы добавить соответствующие дни в объект Date, а затем сохранить это. Я пытаюсь это сделать следующим образом:

let orderIdDateCorrectionDict = [ 
    { "orderId": "2020053100", "dayCorrection": -146 }, 
    { "orderId": "2020053109", "dayCorrection": -146 }, 
    { "orderId": "2020053100", "dayCorrection": -146 }, 
];

migrateUp(db.Orders);
var index = 0;

function migrateUp(targetCollection) {

    targetCollection.find({
        OrderId: { $in: orderIdDateCorrectionDict.map(i => i.orderId) }
    }).forEach(
        function (order) {

            order.TransDate.DateTime = order.TransDate.DateTime.addDays(orderIdDateCorrectionDict[index++].dayCorrection);
            order.TransDate.Ticks = NumberLong((order.TransDate.DateTime.getTime() * 10000) + 621355968000000000);

            targetCollection.save(order);
        }
    );
};

Date.prototype.addDays = function (days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

Это дает мне ошибку

{"message": "Невозможно прочитать свойство 'dayCorrection' of undefined", "stack": "script: 9478: 126 "+" сценарий: 14: 70 "+" сценарий: 14: 70 "+" сценарий: 9475: 8 "+" сценарий: 9460: 1 "}

Как мне обновить соответствующую запись с правильным значением int дня?

1 Ответ

0 голосов
/ 18 июня 2020

Ошибка свидетельствует о наличии повторяющихся идентификаторов заказов в данных. В результате поиск производит больше заказов, чем имеется элементов в orderIdDateCorrectionDict, а index увеличивается за пределами этого массива, производя неопределенное значение (и, таким образом, «не может прочитать свойство ... неопределенного»)

На этапе отладки подтвердите, что вы получаете ровно N заказов при запросе N идентификаторов. Если вы этого не сделаете, то у вас есть неуникальные идентификаторы, и исправление должно быть сделано в другом месте, где бы эти дубликаты не создавались.

Чтобы защитить код OP от этой проблемы, независимо от того, как настроены идентификаторы, не используйте параллельный счетчик index. Вместо этого найдите исправление по orderId, вот так ...

function orderCorrectionForId(orderId) {
  return orderIdDateCorrectionDict.find(oc => oc.orderId === orderId)
}

// no need for the index variable
// in the forEach loop...

function (order) {
  let correction = orderCorrectionForId(order.OrderId)
  if (correction) {
    order.TransDate.DateTime = order.TransDate.DateTime.addDays(correction.dayCorrection);
    // and so on...
  }

Но начните с регистрации order в этой функции forEach, чтобы вы могли решить проблему root, которая - результат запроса, которого вы не ожидаете.

...