【问题标题】:Transform array of objects into array of objects with an extra property with map, filter, reduce使用 map、filter、reduce 将对象数组转换为具有额外属性的对象数组
【发布时间】:2019-09-01 16:35:30
【问题描述】:

我有以下对象数组:

[
{id: 1, updatedVersion: 7},
{id: 2, updatedVersion: 0},
{id: 7, updatedVersion: 9},
{id: 10, updatedVersion: 11},
{id: 9, updatedVersion: 0},
{id: 11, updatedVersion: 0},
]

updatedVersion 为零的为最新版本。

从该数组中,我能够过滤出最新版本并且至少有一个先前版本的数组, 它们是 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 的更优雅的解决方案。我将不胜感激有关如何解决此问题的任何提示。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    这不是很有效,但希望能满足“优雅”的要求;)

    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);

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 2021-12-27
      • 2021-11-10
      • 2019-02-10
      • 2022-12-08
      • 2017-12-24
      • 2023-01-27
      • 2016-04-17
      • 2023-03-14
      相关资源
      最近更新 更多