提问者:小点点

将一个对象映射到多个对象的数组


null

{
 role:'admin',
 resource:['calendar','appraisal'],
 action:['create:any','read:any','update:any','delete:any']
}
{
 role:'user',
 resource:['calendar','appraisal'],
 action:['create:own','read:any','update:own','delete:own']
}

变成这个:

[
 {role: 'admin', resource: 'calendar', action: 'create:any'},
 {role: 'admin', resource: 'calendar', action: 'read:any'},
 {role: 'admin', resource: 'calendar', action: 'update:any'},
 {role: 'admin', resource: 'calendar', action: 'delete:any'},
 {role: 'user', resource: 'calendar', action: 'create:own'},
 {role: 'user', resource: 'calendar', action: 'read:any'},
 {role: 'user', resource: 'calendar', action: 'update:own'},
 {role: 'user', resource: 'calendar', action: 'delete:own'},
]

我用不同的方法尝试了array.map()方法,但仍然没有成功。如有任何答案我将不胜感激。谢啦!


共3个答案

匿名用户

您可以使nestarray.flatMap()调用(最后一个可以只是map)迭代数组(resourceaction)并生成一个扁平的对象数组:

null

const arr = [{
  role: 'admin',
  resource: ['calendar', 'appraisal'],
  action: ['create:any', 'read:any', 'update:any', 'delete:any']
}, {
  role: 'user',
  resource: ['calendar', 'appraisal'],
  action: ['create:own', 'read:any', 'update:own', 'delete:own']
}]

const result = arr.flatMap(({ resource: res, action: act, ...obj }) =>
  res.flatMap(resource =>
    act.map(action => ({
      ...obj,
      resource,
      action,
    }))
  )
)

console.log(result)

匿名用户

null

null

const data = [{
   role:'admin',
   resource:['calendar','appraisal'],
   action:['create:any','read:any','update:any','delete:any']
 },
 {
   role:'user',
   resource:['calendar','appraisal'],
   action:['create:own','read:any','update:own','delete:own']
}];

const mapped = data.flatMap(({role, resource, action}) =>
                 resource.flatMap(resource => 
                   action.map(action => ({role, resource, action}))));

console.log(mapped)

匿名用户

null

const json = [
    {
        role:'admin',
        resource:['calendar','appraisal'],
        action:['create:any','read:any','update:any','delete:any']
   },
   {
        role: 'user',
        resource:['calendar','appraisal'],
        action:['create:own','read:any','update:own','delete:own']
    }  
];

const getOutput = (arr) => {
    return arr.reduce((acc, cur) => {
        const roleOutput = cur.action.reduce((actionAcc, actionCur) => 
            [
                ...actionAcc,
                ...cur.resource.map(resVal => ({
                    role: cur.role,
                    resource: resVal,
                    action: actionCur
                }))
            ]
        , []);
            
        return [...roleOutput, ...acc];
    }, []);
}

console.log(getOutput(json));