You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并多组错误对象数组为单个对象并简化现有实现?

简化多嵌套错误对象合并的实现方式

需求:将包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:23:25