如何合并多组错误对象数组为单个对象并简化现有实现?
简化多嵌套错误对象合并的实现方式
需求:将包含100余种不同键名的无类型对象数组,把所有类型对应的错误对象合并为一个单一对象。
输入示例
const input = [ { "type":"cat", "errors":[ { "keyA":"This is wrong!", "keyB":"This is more wrong!!", "keyC":"...horrible, just horrible" } ] }, { "type":"dog", "errors":[ { "key1":"whoops", "key2":"somebody has a typo" }, { "keyX":"umm...really?", "keyY":"when did it start raining?" } ] } ]
期望输出
{ "keyA":"This is wrong!", "keyB":"This is more wrong!!", "keyC":"...horrible, just horrible", "key1":"whoops", "key2":"somebody has a typo", "keyX":"umm...really?", "keyY":"when did it start raining?" }
当前实现(可运行但希望更简洁)
const returnVal = val.reduce((acc,curr) => { return ([...acc.errors, ...curr.errors] as any).reduce((a: any, c: any) => ({...a, ...c}), {}); });
更简洁的实现方案
方案1:flatMap + Object.assign合并
用flatMap直接提取所有嵌套的错误对象,再通过Object.assign一次性合并到空对象中,完全避免嵌套调用:
const mergedErrors = Object.assign({}, ...input.flatMap(item => item.errors));
方案2:单次reduce完成合并
如果不想用flatMap,可以用单次reduce遍历数组,每次将当前项的错误对象合并到累计结果中:
const mergedErrors = input.reduce((acc, item) => { return {...acc, ...Object.assign({}, ...item.errors)}; }, {});
方案3:Object.fromEntries展开键值对
把所有错误对象的键值对展开为二维数组,再通过Object.fromEntries转换为目标对象:
const mergedErrors = Object.fromEntries( input.flatMap(item => item.errors.flatMap(err => Object.entries(err))) );
注:以上方案均和原实现逻辑一致——若存在重复键名,后出现的键值会覆盖之前的。
内容的提问来源于stack exchange,提问作者Wonder Twin
相关产品推荐
相关产品推荐

