#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 час.
Нужно ли мне сначала разрезать массив на поддиапазоны?