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
相关产品推荐
相关产品推荐

