簡體   English   中英

使用 map、filter、reduce 將對象數組轉換為具有額外屬性的對象數組

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

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