繁体   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