如何将对象数组映射为带自定义键的对象?
如何将对象数组映射为带自定义键的对象?
你当前用map方法得到的是字符串数组,但实际需要的是以id为键、name为值的对象。map本身是用来生成新数组的,所以得换用合适的方法实现需求,下面是几种可行方案:
方案一:使用reduce方法(推荐)
这是处理这类数组转对象场景最常用的方式:
const categories = [ { id: 4, name: "Hotel" }, { id: 3, name: "Mall" }, { id: 2, name: "Resort" }, { id: 1, name: "Restaurant" }, { id: 5, name: "Staycation" }, { id: 6, name: "Store" }, ]; const result = categories.reduce((acc, category) => { acc[category.id] = category.name; return acc; }, {}); // 初始值传入空对象作为累加器 console.log(result);
运行后就能得到你期望的:{ 1: 'Restaurant', 2: 'Resort', 3: 'Mall', 4: 'Hotel', 5: 'Staycation', 6: 'Store' }
方案二:使用Object.fromEntries(ES2019+)
如果你的运行环境支持ES2019及以上,可以用更简洁的写法:
const result = Object.fromEntries( categories.map(category => [category.id, category.name]) ); console.log(result);
思路是先用map把每个对象转成[键, 值]格式的数组,再通过Object.fromEntries把二维数组直接转换成对象。
方案三:手动循环遍历
最基础的实现方式,逻辑清晰易懂:
const result = {}; for (const category of categories) { result[category.id] = category.name; } console.log(result);
为什么原来的代码不符合预期?
map方法的核心作用是将数组的每个元素转换为新值,最终返回一个新数组,所以你之前的代码会把每个对象转成字符串,最终得到字符串数组,而不是目标对象。
内容的提问来源于stack exchange,提问作者Larra
相关产品推荐
相关产品推荐

