[英]How to flatten an object property array has array has array in javascript (es6)?
给定一个树形对象:
您如何使用javascript使其扁平化,并最终获得一系列权限
就像是:
user.roles.map(r = r.permissionGroups).flatten().reduce(pg => pg.permissions).flatten();
那是经典的地图减少问题吗?
这是一个(浅)展平函数:
var flatten = array => array.reduce( ( a, b ) => a.concat( b ), [] );
您可以像这样应用它。
var permissionGroups = flatten( user.roles.map( r => r.permissionGroups ) );
var permissions = flatten( permissionGroups.map( pg => pg.permissions ) );
您是正确的, reduce()
可能会给出最干净的方法。
您可以将concat()
组合在一起:
const allPermissions = user.roles.reduce((r, role) =>
r.concat(role.permissionGroups.reduce((r, group) =>
r.concat(group.permission), []),
[]);
请注意,实际上每次返回时都会创建一个新数组,因此,如果角色很多,效率可能会有些低。 要做到这一点而不必每次都创建新数组,可以改用push.apply()
:
const allPermissions = user.roles.reduce((r, role) =>
r.push.apply(r, role.permissisionGroups.reduce((r, group) =>
r.push.apply(r, group.permissions), []),
[]);
使用apply()
将允许您将权限作为参数传递(基本上与调用push()
相同)。 如果您尝试推送一个数组,它将把它推送为一个数组,而不是单个值。
如果要更进一步,并始终保持一个阵列,可以使用:
const allPermissions = []; user.roles.forEach(角色=> role.permissionGroups.forEach(group => allPermissions.push.apply(allPermissions,group.permissions)))
从本质上讲,这仍然是一个reduce()
模式,但是不会创建很多额外的值。 如果您想使用reduce()
,它可能看起来像这样:
const allPermissions = user.roles.reduce((r, role) =>
r.push.apply(r, role.permissionGroups.reduce((r, group) =>
r.push.apply(r, group.permissions)), r),
[]
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.