在 JS 中合并不相交的对象数组

Merge disjoint object arrays in JS

提问人:stuwilmur 提问时间:8/31/2022 更新时间:8/31/2022 访问量:55

问:

我正在努力寻找一种优雅可靠的方法来合并香草JS或d3.js中的两个数组,其中

  • 系列的“行”不一定匹配;
  • 对象可能共享某些属性,但不是全部属性;
  • “missing”属性填充为 null。

例如,格式为

A = 
[
    {
        year : 2001, 
        gdp : 1.1, 
        population : 1100
    },
    {
        year : 2002, 
        gdp : 1.2, 
        population : 1200
    },
]

B = 
[
    {
        year : 2000, 
        gdp : 1.0, 
        rainfall : 100
    },
    {
        year : 2001, 
        gdp : 1.1, 
        rainfall : 110
    }
]

理想情况下,会结合起来给予

C = 
[
    {
        year : 2000, 
        gdp : 1.0, 
        population : null,
        rainfall : 10
    },
    {
        year : 2001, 
        gdp : 1.1, 
        population : 1100,
        rainfall : 110
    },
    {
        year : 2002, 
        gdp : 1.2, 
        population : 1200,
        rainfall : null
    },
]

我通常可以弄清楚这种事情,但这个让我真的陷入困境!

JavaScript D3.js 数据操作

评论

0赞 Nina Scholz 8/31/2022
是固定值还是动态值?你试过什么?gdp
0赞 stuwilmur 8/31/2022
如果我理解正确的话,GDP 是固定的,因为它每年都是相同的。我正在尝试使用 d3.nest,但我没有看到如何做到这一点。

答:

2赞 Nina Scholz 8/31/2022 #1

您可以构建一个包含所有项的数组,获取键并构建一个空对象作为空对象的模式。然后按以下方式分组并获取值。如有必要,应用排序。year

const
    a = [{ year: 2001, gdp: 1.1, population: 1100 }, { year: 2002, gdp: 1.2, population: 1200 }],
    b = [{ year: 2000, gdp: 1.0, rainfall: 100 }, { year: 2001, gdp: 1.1, rainfall: 110 }],
    items = [...a, ...b],
    empty = Object.fromEntries(Object.keys(Object.assign({}, ...items)).map(k => [k, null])),
    result = Object
        .values(items.reduce((r, o) => {
            r[o.year] ??= { ...empty };
            Object.assign(r[o.year], o);
            return r;
        }, {}))
        .sort((a, b) => a.year - b.year);
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }