如何将对象数组指定属性存入config子对象?JS/TS方案
解决方案:批量将属性存入初始为undefined的config对象
首先明确问题核心:你的代码仅保留最后一个属性是因为循环中每次都重新赋值config为单个属性的对象;Object.assign报错则是因为它的目标参数不能是undefined。以下是具体的JS/TS实现方案:
问题重现(错误代码示例)
// 原始数据 const items = [ { id: 1, config: undefined }, { id: 2, config: undefined } ]; const dict = { bgColor: '#fff', sizeLarge: 120, sizeMedium: 100, sizeSmall: 80, name: 'default' }; // 错误写法1:循环覆盖,仅保留最后一个属性 items.forEach(item => { for (const key in dict) { item.config = { [key]: dict[key] }; // 每次赋值都会覆盖之前的对象 } }); // 错误写法2:Object.assign报错 items.forEach(item => { Object.assign(item.config, dict); // 报错:Cannot convert undefined or null to object });
正确实现方案
JavaScript 版本
方法1:用Object.assign先初始化config
先确保config是一个空对象,再批量合并dict的所有属性:
items.forEach(item => { // 若config为undefined,先初始化为空对象 item.config = item.config || {}; // 把dict的所有属性合并到config中 Object.assign(item.config, dict); });
方法2:对象展开语法(更简洁)
直接用展开运算符合并现有config(如果存在)和dict的属性:
items.forEach(item => { item.config = { ...(item.config || {}), ...dict }; });
TypeScript 版本(带类型约束)
先定义对应的类型,避免类型报错:
// 定义Config类型,包含需要的所有属性 type Config = { bgColor: string; sizeLarge: number; sizeMedium: number; sizeSmall: number; name: string; }; // 定义Item类型,config可选且初始可能为undefined type Item = { id: number; config?: Config; }; // 初始化数据 const items: Item[] = [ { id: 1, config: undefined }, { id: 2, config: undefined } ]; const dict: Config = { bgColor: '#fff', sizeLarge: 120, sizeMedium: 100, sizeSmall: 80, name: 'default' }; // 处理逻辑 items.forEach(item => { item.config = { ...(item.config || {}), ...dict }; });
关键说明
- 循环覆盖问题:之前的循环每次都给
item.config赋值新对象,导致之前的属性被覆盖,必须一次性合并所有属性,而非逐个赋值。 Object.assign报错问题:该方法要求第一个参数必须是对象,所以必须先把undefined的config初始化为空对象,再进行合并。
处理后每个对象的config会包含dict中的所有属性,符合预期结果。
内容的提问来源于stack exchange,提问作者Viira
相关产品推荐
相关产品推荐

