簡體   English   中英

如何對數組進行重復數據刪除,並根據其重復向數組的每個 object 添加其他屬性

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

這里真正的關鍵是iddate的組合。 我希望最終結果如下所示:

[
  { 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM