javascript - 使用 map、filter、reduce 将对象数组转换为具有额外属性的对象数组

标签 javascript arrays

我有以下对象数组:

[
{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 的更优雅的解决方案。我将不胜感激有关如何处理此问题的任何提示。

最佳答案

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

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

关于javascript - 使用 map、filter、reduce 将对象数组转换为具有额外属性的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57747728/

相关文章:

Javascript Div的宽度根据屏幕宽度

javascript - 根据选定的 Angular js值下拉负载

python - 无法修改屏蔽数组中的数据。 arr[i] 与 arr.data[i]

java - Array 和 ArrayList 获取素数有什么区别?

javascript - 使用 Javascript 将 CSV 从 URL 解析为数组

javascript - 在异步的 mousemove 处理程序中进行回调

javascript - 从前一个函数添加到数组

javascript - 需要 javascript 中的函数来交换数组中的 2 个元素

c++ - 如何将 std::array 转换为一个点?

javascript - 如何用 CKEditor 4.0 的默认样式表覆盖网站模板的样式表