我有以下对象数组:
[
{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/