[英]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.