![](/img/trans.png)
[英]Using map with reduce in javascript to filter objects in an array
[英]Transform array of objects into array of objects with an extra property with map, filter, reduce
我有以下對象數組:
[
{id: 1, updatedVersion: 7},
{id: 2, updatedVersion: 0},
{id: 7, updatedVersion: 9},
{id: 10, updatedVersion: 11},
{id: 9, updatedVersion: 0},
{id: 11, updatedVersion: 0},
]
updateVersion 為零的版本是最新版本。
從該數組中,我能夠過濾出最新版本並且至少有一個先前版本的對象,這些對象是 id 為 9 和 11 的對象。(不包括 id === 2 的對象,因為它是最新版本,但是沒有以前的版本)。
我現在需要的是在這兩個 id 為 9 和 11 的對象中創建一個額外的屬性(再次:最新版本的對象並且至少有一個以前的版本),稱為 versionHistory,這將是以前版本的有序數組該對象,從最近到最舊。
所以它看起來像這樣:
[
{ id: 9,
updatedVersion: 0,
versionHistory: [
{id: 7, updatedVersion: 9},
{id: 1, updatedVersion 7}
]
},
{
id: 11,
updatedVersion: 0,
versionHistory: [
{id: 10, updatedVersion: 11}
]
}
]
我想出了一個丑陋的解決方案,它涉及嵌套的 for 循環,但我正在尋找使用 map、filter 和 reduce 的更優雅的方法。 我將不勝感激有關如何解決此問題的任何提示。
這不是非常有效,但希望滿足“優雅”的要求;)
data = [ {id: 1, updatedVersion: 7}, {id: 2, updatedVersion: 0}, {id: 7, updatedVersion: 9}, {id: 10, updatedVersion: 11}, {id: 9, updatedVersion: 0}, {id: 11, updatedVersion: 0}, ] let prev = node => data.find(n => n.updatedVersion === node.id); let path = node => node ? [node, ...path(prev(node))] : []; let result = data.filter(n => n.updatedVersion === 0).map(node => ({ versionHistory: path(node).slice(1), ...node, })); console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.