繁体   English   中英

根据键值合并对象数组

[英]Merge array of objects based on key value

我将如何转动这样的对象数组

const scores = [
{
   year: 2020,
   dave: 20
},
{
   year: 2020,
   steve: 17
},
{
   year: 2019,
   bill: 18
}
];

进入这个

const scores = [
{
   year: 2020,
   dave: 20,
   steve: 17
},
{
   year: 2019,
   bill: 18
}
];

我使用了一个Array.reduce()并拥有一个 Object ,其键为年份并继续分配对象,后来取出了值。

 const scores = [ { year: 2020, dave: 20 }, { year: 2020, steve: 17 }, { year: 2019, bill: 18 } ]; const mergedOb = scores.reduce((acc, ob) => { if (acc[ob.year]) { Object.assign(acc[ob.year], ob); } else { acc[ob.year] = ob } return acc; }, {}); const mergeArr = Object.values(mergedOb) console.log(mergeArr)

你在找这个吗?

<!DOCTYPE html>
<html>

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>

<body>
  <script>
    $(function () {
        const scores = [
            {
                year: 2020,
                dave: 20
            },
            {
                year: 2020,
                steve: 17
            },
            {
                year: 2019,
                bill: 18
            }
        ];

        var groupBy = function (xs, key) {
            return xs.reduce(function (rv, x) {
                (rv[x[key]] = rv[x[key]] || []).push(x);
                return rv;
            }, {});
        };

        console.log(groupBy(scores, 'year'));
    })
</script>
</body>
</html>

可以用_.flow()创建一个function,使用_.groupBy()year的物品收集到arrays,然后映射合并ZA3CBC3F9D0CE2F2C1554E1B671CZD7:

 const { flow, groupBy, map, merge } = _;; const fn = flow( arr => groupBy(arr, 'year'), groups => map(groups, g => merge({}, ...g)) ); const scores = [{"year":2020,"dave":20},{"year":2020,"steve":17},{"year":2019,"bill":18}]; const result = fn(scores); console.log(result);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

使用 lodash/fp 使这个解决方案更加简洁:

 const fn = flow( groupBy('year'), map(mergeAll) ); const scores = [{"year":2020,"dave":20},{"year":2020,"steve":17},{"year":2019,"bill":18}]; const result = fn(scores); console.log(result);
 <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

但是,由于_.mergeBy()创建一个 object,按数字分组,将更改组的顺序(2019 年之后的 2020 年)。 您可以将数组简化为 Map 以保留顺序,然后通过传播 Map 的值迭代器将其转换为数组:

 const scores = [{"year":2020,"dave":20},{"year":2020,"steve":17},{"year":2019,"bill":18}]; const result = [...scores.reduce((r, o) => r.set(o.year, {...r.get(o.year), ...o }), new Map()).values()]; console.log(result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM