typescript 合并属于数组中对象的字段

r1zhe5dt  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(323)

我是TypeScript的新手,我正在努力完成一项基本任务。我有一个这样的对象数组:

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

我想把它变成这样

//Desired result: {a: [5, 7, 6], b: [10, null, 7], c: [null, 8, 9]};

请注意,如果对象中缺少该值,则用null表示。我希望首先我需要知道我计划填充的所有字段,所以从下面开始:

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

接下来,我创建一个对象来保存结果。

// To hold result
var result: Record<string, any[]> = {};

最后,我迭代了我的数组,对于每个对象,我尝试提取字段(如果它存在)并将其推入最终对象中的数组。如果字段是undefined,我使用null并推送它。

boop.forEach(item => { // Loop through each item
    for(let field of uniqueKeys){ // Loop through each field for each item
        let value = item[field as keyof typeof item]; // Get value (if it exists!)
        value ??= null;
        result[field].push(value);
    } 
})

这会产生错误:
[ERR]:undefined不是对象(正在计算'result[field]. push')
问题似乎是推送,因为当我使用result[field] = [1, 2, 3];时,我可以为我的对象赋值,没有问题。
如何正确地将值推入对象中的每个数组?

gg58donl

gg58donl1#

如果其他人遇到类似的问题,解决方案是我需要首先用空数组初始化我的对象。比如说

for(let field of uniqueKeys) {
    result[field] = [];
}

因此,完整的代码是,

// 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, any[]> = {};

// Initialise arrays in object 
for(let field of uniqueKeys) {
    result[field] = [];
}

boop.forEach(item => { // Loop through each item
    for(let field of uniqueKeys){ // Loop through each field for each item
        let value = item[field as keyof typeof item]; // Get value (if it exists!)
        result[field].push(value);
    } 
})

console.log(result);

结果:

[LOG]: {
  "a": [
    5,
    7,
    6
  ],
  "b": [
    10,
    undefined,
    7
  ],
  "c": [
    undefined,
    8,
    9
  ]
}

不完美,因为我有undefined而不是null,但这是另一个问题...

相关问题