TypeScript如何简便批量修改对象数组首个元素的所有属性值
批量为对象所有属性统一赋值的实现方案
你不需要手动枚举每个键名来赋值,下面几种写法都可以实现需求,且兼容你现有的FoodItems TypeScript类型定义,后续类型增减属性也不需要修改赋值逻辑:
1. 仅修改数组第一个对象(不修改原数据,生成新数组)
如果要遵循不可变数据规范,不改动原数组和原对象,用这个写法:
const newValue = 34; const updatedArray = [ // 遍历第一个对象的所有键批量赋值 Object.keys(objArray[0]).reduce((acc, key) => { acc[key as keyof FoodItems] = newValue; return acc; }, {} as FoodItems), // 保留数组中第一个元素之后的其他内容 ...objArray.slice(1) ];
2. 批量修改数组中所有对象的属性值
如果数组里不止一个对象,要把所有对象的属性都改成目标值,可以用Object.fromEntries简化写法:
const updatedAllArray = objArray.map(item => Object.fromEntries( Object.keys(item).map(key => [key, newValue]) ) as FoodItems );
3. 直接修改原数组的第一个对象(会改动原数据)
如果不需要保留原数据,直接修改原对象的写法最简洁:
Object.keys(objArray[0]).forEach(key => { objArray[0][key as keyof FoodItems] = newValue; });
说明
- 代码中的
as keyof FoodItems、as FoodItems是TypeScript类型断言,因为原生Object.keys默认返回string[]类型,加上断言后可以完全匹配你定义的类型,不会抛出类型错误。 - 所有写法都不需要手动维护属性名列表,后续你给
FoodItems类型增删属性,赋值逻辑不需要做任何调整。 - 注意你描述里的小笔误:提到的
FooItems[]和实际定义的FoodItems拼写不一致,实际使用时保持类型名统一即可。
内容的提问来源于stack exchange,提问作者Kiara Tansas
相关产品推荐
相关产品推荐

