Обновление массива объектов с метками времени

#arrays #object

Вопрос:

У меня есть структура данных, подобная этой :

 var records = [
  {
    firstName: "Akira",
    id: "0543236543",
  },
  {
    firstName: "Harry",
    id: "0994372684",
  },
  {
    firstName: "Sherlock",
    id: "0487345643",
  },
  {
    firstName: "Kristian",
    id: "04873452342",
  },
];
 

Я хочу создать функцию, которая добавляла бы свойство даты (с поправкой на часы) к каждому объекту в массиве в зависимости от длины массива.

Вот мой код до сих пор

 function updateObject(obj) {
  let timeNow = new Date();
  let addHours = (h) => timeNow.setHours(timeNow.getHours()   h);
  const ids = obj.map((record) => record.id);
  const lastNames = obj.map((record) => record.id);
  const time = obj.map(
    (record, index) => (record["time"] = new Date(addHours(index)))
  );
  return obj;
}
 

Это возвращает:

 [
  {
    firstName: 'Akira',
    id: '0543236543',
    time: 2021-05-18T12:25:59.366Z
  },
  {
    firstName: 'Harry',
    id: '0994372684',
    time: 2021-05-18T13:25:59.366Z
  },
  {
    firstName: 'Sherlock',
    id: '0487345643',
    time: 2021-05-18T15:25:59.366Z
  },
  {
    firstName: 'Kristian',
    id: '04873452342',
    time: 2021-05-18T18:25:59.366Z
  }
]
 

Первая проблема: я хочу обновить время, добавив 0,1,2,3 часа к текущему времени.
В настоящее время это:
добавляет 0 ко времени и устанавливает текущее время
, добавляет 1 к обновленному времени и устанавливает его как текущее время и так далее.

Во-вторых: я хочу изменить функцию, чтобы она добавляла дополнительный аргумент «приращение времени», который, если установлено значение x, обновит свойство времени для первых записей x в течение 0 часов и следующих записей x в течение 1 часа.

Надеюсь, в этом есть смысл 🙂

Ответ №1:

Первая проблема может быть решена путем изменения addHours на чистую функцию, которая не мутирует timeNow :

 const timeNow = Date.now();
const addHours = (h) => new Date(timeNow   h * 60 * 60 * 1000);
 

Вторую проблему можно решить, посмотрев на индекс на карте:

 const time = obj.map(
(record, index) => (record["time"] = new Date(addHours(index > increment ? 1 : 0))));
 

И вообще, я бы не советовал мутировать объекты/массивы. Чистые функции, как правило, легче рассуждать и предлагают меньше сюрпризов.
Я бы написал updateObject функцию так, чтобы она не мутировала оригинал, а возвращала новый массив с новыми объектами.

Ответ №2:

Спасибо! Что делать, если параметр increment определяет, сколько первых записей x должно иметь свойство time, увеличенное на 1 ч, например, длина массива моих контактов равна 4.

 function updateObject(records, 1) {
  \code here
}
 

У первого объекта свойство time будет увеличено на 0 часов.
У второго объекта свойство времени будет увеличено на 1 час.
У третьего объекта свойство времени будет увеличено на 2 часа.
У четвертого объекта свойство времени будет увеличено на 3 часа.

 function updateObject(records, 3) {
  \code here
}
 

У первых 3 объектов свойство time будет увеличено на 0 часов.
У четвертого объекта свойство времени будет увеличено на 1 час.

Нужно ли мне сначала разрезать массив на поддиапазоны?