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

TypeScript合并数组对象字段时push报错,求正确实现方法

问题解决:对象数组转键值为数组的对象(补全null)

你的错误原因很明确:result对象里的每个字段一开始都没有初始化数组,当你第一次执行result[field].push(value)时,result[field]是undefined,自然没法调用push方法。

修复步骤

在开始遍历boop数组前,先给result的每个唯一键初始化一个空数组:

// 初始化每个键对应的空数组
uniqueKeys.forEach(key => {
  result[key] = [];
});

完整修正代码

// Dummy data
let boop = [
    {a: 5, b: 10},
    {a: 7, c: 8},
    {a: 6, b: 7, c: 9}
];

// Get unique keys
let uniqueKeys = Object.keys(boop.reduce((result, row) => {
         return Object.assign(result, row);
}, {})) 

// To hold result
var result: Record<string, (number | null)[]> = {}; // 替换any为更精确的类型

// 先初始化每个键的空数组
uniqueKeys.forEach(key => {
  result[key] = [];
});

boop.forEach(item => {
    for(let field of uniqueKeys){
        let value = item[field as keyof typeof item];
        value ??= null;
        result[field].push(value);
    } 
})

console.log(result); 
// 输出:{a: [5, 7, 6], b: [10, null, 7], c: [null, 8, 9]}

额外优化(可选)

如果想让代码更紧凑,可以用reduce一次性完成整个转换,省去单独的初始化和遍历步骤:

const result = uniqueKeys.reduce((acc, key) => {
  acc[key] = boop.map(item => item[key as keyof typeof item] ?? null);
  return acc;
}, {} as Record<string, (number | null)[]>);

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:45:12