Вот небольшая выборка данных, представляющая большой набор данных:
const data = [
{ id: 32, minimum: 200, maximum: 400 },
{ id: 16, minimum: 370, maximum: 390 },
{ id: 85, minimum: 700, maximum: 950 }
];
Необходимо создать объект из этих данных, используя id в качестве ключа и имея минимальное и максимальное значение в качестве значения, например:
Текущий подход к созданию этого объекта следующий:
let object = {};
data.forEach(o => {
object[o.id] = { min: o.minimum, max: o.maximum }
});
console.info(object);
Хотя это работает, кажется, что должен быть более краткий способ написания этого кода.
Я экспериментировал с .map() -
const obj = data.map(o => ({[o.id]: { min: o.minimum, max: o.maximum }}));
console.info(obj);
Но вывод не в правильном формате -
Что нужно изменить в версии .map(), чтобы добиться нужного формата вывода?
map()
всегда создает массив. Вот что он делает. Он берет один массив и переводит его в другой.
// mapper simply creates the object that you want from the one that you have - id as the key and min and max are the values
const mapper = ({ id, minimum: min, maximum: max }) => ({ [id]: { min, max } });
const obj = data.reduce((acc, obj) => ({
...acc,
...mapper(obj)
}), {});
Обновлено:
В то время как сокращение — правильный способ сделать это — вы уменьшаете массив до одной вещи, JavaScript позволяет вам делать разные вещи. Вот альтернативное решение с использованием карты и Object.assign:
const mapper = ({ id, minimum: min, maximum: max }) => ({ [id]: { min, max } });
const obj = Object.assign(...data.map(mapper));
Вы можете взять Object.fromEntries и сопоставьте записи.
const
data = [{ id: 32, minimum: 200, maximum: 400 }, { id: 16, minimum: 370, maximum: 390 }, { id: 85, minimum: 700, maximum: 950 }],
result = Object.fromEntries(
data.map(({ id, minimum: min, maximum: max }) => [id, { min, max }])
);
console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }