![](/img/trans.png)
[英]Using map with reduce in javascript to filter objects in an array
[英]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.