如何在JavaScript中无初始依赖属性地将数组转换为对象
解决方案
你只需要在reduce的回调函数中,先初始化空对象里缺失的ids和items属性,就能用空对象作为初始值完成转换。以下是修改后的完整代码:
import { v4 as id } from "uuid"; export const createItem = (name) => { return { id: id(), name, packed: false }; }; let items = ["Backpack", "Vitamins", "Kindle"].map((x) => createItem(x)); console.log(items); const converter = items.reduce( (obj, item) => { // 初始化缺失的属性 if (!obj.ids) obj.ids = []; if (!obj.items) obj.items = {}; obj.ids.push(item.id); obj.items[item.id] = item; return obj; }, {} // 初始值改为空对象 ); console.log(converter);
逻辑说明
- 初始值传入空对象
{},不再依赖预先声明的固定结构 - 每次迭代时,先检查当前累加对象
obj是否包含ids和items属性,若不存在则创建对应的空数组/空对象 - 后续操作和原代码保持一致,将item的id存入
ids数组,同时把item挂载到items对象的对应id键下
如果你想用更简洁的语法,可以使用ES2021的逻辑空赋值运算符??=,效果和上面的判断逻辑完全一致:
const converter = items.reduce( (obj, item) => { obj.ids ??= []; obj.items ??= {}; obj.ids.push(item.id); obj.items[item.id] = item; return obj; }, {} );
内容的提问来源于stack exchange,提问作者Mamunur Rashid
相关产品推荐
相关产品推荐

