首页 > 解决方案 > 使用 .map() 而不是 .forEach 来创建对象

问题描述

这是代表较大数据集的一小部分数据:

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.log(object);

虽然这可行,但似乎应该有一种更简洁的方式来编写这段代码。

我已经尝试过.map()-

const obj = data.map(o => ({[o.id]: { min: o.minimum, max: o.maximum }}));
console.log(obj);

但输出格式不正确 -

在此处输入图像描述

应该在.map()版本中进行哪些更改以实现所需的输出格式?

标签: javascriptobject

解决方案


// 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)
}), {});

编辑:

虽然 reduce 是做到这一点的正确方法——你正在一个数组归约为一个单一的东西,但 JavaScript 允许你以多种方式做事。这是使用 map 和的替代解决方案Object.assign

const mapper = ({ id, minimum: min, maximum: max }) => ({ [id]: { min, max } });

const obj = Object.assign(...data.map(mapper));

推荐阅读