Object.entries 配合 reduce 是构建业务 Map 最直接可控的方式,支持解构、条件判断与嵌套处理,适用于表单校验、API 请求体、类型分组及嵌套扁平化等场景。
Object.entries 配合 reduce 是将对象结构化转换为业务 Map(即键值映射结构,不特指 JavaScript 的 Map 类型,而是泛指“字段名 → 处理后值”的映射关系)最直接、可控的方式之一。它天然支持解构、条件判断与嵌套处理,适合构建表单校验规则、API 请求体、状态映射表等场景。
用 Object.entries + reduce 构建字段规则 Map
比如后端接口要求每个字段携带 value 和校验状态 valid,原始对象是:
const formData = { username: 'admin', email: '', age: 25 };
目标结构是:
{ username: { value: 'admin', valid: true }, email: { value: '', valid: false }, age: { value: 25, valid: true } }
实现方式:
- 用
Object.entries() 拆出 [key, value] 对 - 在
reduce() 回调中逐个判断并组装新结构 - 必须传入初始值
{},否则空对象或单属性对象会出错
const ruleMap = Object.entries(formData).reduce((acc, [k, v]) => {
acc[k] = {
value: v,
valid: v !== null && v !== undefined && (typeof v !== 'string' || v.trim() !== '')
};
return acc;
}, {});
按类型分组生成分类 Map
当需要把对象字段按数据类型归类(如字符串字段、数字字段、布尔字段),可借助 reduce 累积到不同子对象中:
const config = { host: 'api.example.com', port: 8080, enabled: true, timeout: 5000 };
const typeMap = Object.entries(config).reduce((acc, [k, v]) => {
const type = typeof v;
if (!acc[type]) acc[type] = {};
acc[type][k] = v;
return acc;
}, {});
// → { string: { host: '...' }, number: { port: 8080, timeout: 5000 }, boolean: { enabled: true } }
嵌套对象转扁平路径 Map(带 key 路径)
对配置对象做路径化映射(如 "database.host" → "127.0.0.1"),可用递归 reduce 实现:
- 非对象值直接写入
acc[fullPath] = value
- 对象值则递归调用,拼接
${parentKey}.${childKey}
- 注意排除
null(因 typeof null === 'object')
function flattenToMap(obj, prefix = '') {
return Object.entries(obj).reduce((acc, [k, v]) => {
const key = prefix ? `${prefix}.${k}` : k;
if (v !== null && typeof v === 'object' && !Array.isArray(v)) {
Object.assign(acc, flattenToMap(v, key));
} else {
acc[key] = v;
}
return acc;
}, {});
}
配合 Object.fromEntries 简化逻辑(可选替代)
如果只是做一层映射(无深层累积逻辑),Object.fromEntries() + map() 更简洁:
const apiMap = Object.fromEntries(
Object.entries(formData).map(([k, v]) => [
k.toUpperCase(),
{ input: v, required: ['USERNAME', 'EMAIL'].includes(k.toUpperCase()) }
])
);
但涉及累加、条件合并、多层依赖时,reduce 仍是更稳妥的选择。