
本文介绍如何将对象中每个属性的原始值(字符串、数字等)统一包装为包含该值的数组,适用于表单校验提示、数据标准化等场景。
本文介绍如何将对象中每个属性的原始值(字符串、数字等)统一包装为包含该值的数组,适用于表单校验提示、数据标准化等场景。
在实际开发中,我们常遇到需要统一数据结构的场景——例如后端返回的校验错误对象是扁平键值对,而前端组件(如 Ant Design 的 Form.Item 或自定义验证器)要求每个字段的错误信息必须是数组类型(即使只有一条)。此时,需将对象中每个属性的值“升维”为单元素数组。
最简洁、现代的实现方式是使用 Object.entries() 配合遍历更新:
const errors = {
"tin": "TIN is required",
"bic": "BIC is required"
};
// 方法一:原地修改(推荐用于简单场景)
for (const [key, value] of Object.entries(errors)) {
errors[key] = [value];
}
console.log(errors);
// → { tin: ["TIN is required"], bic: ["BIC is required"] }
若需保持原对象不可变(遵循函数式编程原则或避免副作用),可使用 Object.fromEntries() 构造新对象:
const errors = {
"tin": "TIN is required",
"bic": "BIC is required"
};
const arrayified = Object.fromEntries(
Object.entries(errors).map(([key, value]) => [key, [value]])
);
console.log(arrayified);
// → { tin: ["TIN is required"], bic: ["BIC is required"] }
console.log(errors); // 原对象未被修改
⚠️ 注意事项:
-
Object.entries()仅遍历对象自身的可枚举属性,不包含原型链上的属性; - 若原始值已是数组(如
"tin": ["TIN is required", "Invalid format"]),直接套一层会导致嵌套数组([["TIN is required"]]),此时应先做类型判断; - 在 TypeScript 项目中,建议为转换后对象定义明确类型,例如:
Record<string string></string>。
总结:无论是就地更新还是生成新对象,Object.entries() + map/for...of 是处理此类“值数组化”需求的标准范式,语义清晰、兼容性好(支持 ES2017+),且易于扩展(如添加过滤、去重或批量转换逻辑)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











