[英]How can I de-dupe an array, and add additional properties to each object of the array based on its duplications
假设我有一个如下所示的数组:
[
{ id 1, date: "1/1/2021", count: 2, oldCount: 1 },
{ id 1, date: "2/1/2021", count: 3, oldCount: 2 },
{ id 2, date: "1/1/2021", count: 2, oldCount: 1 },
{ id 2, date: "2/1/2021", count: 3, oldCount: 2 }
]
这里真正的关键是id
和date
的组合。 我希望最终结果如下所示:
[
{ id 1, "1/1/2021": 2, "2/1/2021": 3, "1/1/2021_old": 1, "2/1/2021_old": 2 },
{ id 2, "2/1/2021": 3, "2/1/2021": 3, "1/1/2021_old": 1, "2/1/2021_old": 2 }
]
我更喜欢为此使用lodash 。 让我感到困惑的部分是要添加到阵列中每个 object 的附加属性。 在我们的现实世界场景中,可能有数千条记录需要进行重复数据删除和映射,这是资源密集型的。
你可以看到其中的逻辑。 它按id
分组,并根据原始date
属性的值添加属性名称。
这是我想要的功能的一个无效示例:
arr = _.map(_.groupBy(data, "id"), objs => {
return _.assignWith({ /* I don't know the dates to set the property names */ }, ...objs)
});
我可以用嵌套循环来做到这一点。 我正在寻找最佳性能选项和更少的代码行。
按id
、 map 分组,然后是 map 每个组。 映射组的对象时,创建一个新的 object,其中[date]
和[`${}_old`]
键具有各自的值,然后使用带有数组扩展的_.merge()
将所有对象合并为一个一。
const arr = [{"id":1,"date":"1/1/2021","count":2,"oldCount":1},{"id":1,"date":"2/1/2021","count":3,"oldCount":2},{"id":2,"date":"1/1/2021","count":2,"oldCount":1},{"id":2,"date":"2/1/2021","count":3,"oldCount":2}] const result = _.map( _.groupBy(arr, 'id'), group => _.merge( {}, ..._.map(group, ({ id, date, count, oldCount }) => ({ id, [date]: count, [`${date}_old`]: oldCount })) ) ) console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous"></script>
与 lodash/fp 的想法相同,使用_.flow()
生成更具可读性的 function,并使用_.mergeAll()
合并所有项目 ig 一个组:
const { flow, groupBy, map, mergeAll } = _ const fn = flow( groupBy('id'), map(flow( map(({ id, date, count, oldCount }) => ({ id, [date]: count, [`${date}_old`]: oldCount })), mergeAll )) ) const arr = [{"id":1,"date":"1/1/2021","count":2,"oldCount":1},{"id":1,"date":"2/1/2021","count":3,"oldCount":2},{"id":2,"date":"1/1/2021","count":2,"oldCount":1},{"id":2,"date":"2/1/2021","count":3,"oldCount":2}] const result = fn(arr) console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
一个简单的Array.reduce应该会产生您需要的东西——不需要库或外部依赖项,而且仍然非常简短。
const input = [ { id: 1, date: "1/1/2021", count: 2, oldCount: 1 }, { id: 1, date: "2/1/2021", count: 3, oldCount: 2 }, { id: 2, date: "1/1/2021", count: 2, oldCount: 1 }, { id: 2, date: "2/1/2021", count: 3, oldCount: 2 } ]; const output = Object.values(input.reduce((a, c) => { a[c.id] = a[c.id] || {id: c.id}; a[c.id][c.date] = c.count; a[c.id][`${c.date}_old`] = c.oldCount; return a; }, {})); console.log(output);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.