[英]How to Merge two array of objects based on same key and value in javascript?
[英]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.