How to filtering array of objects to another array of objects in js?

爱⌒轻易说出口 提交于 2020-04-28 22:49:51

问题


I have got two arrays of objects. I want to filter data based on permissionObj.

This is coming from database. Here are arrays of sub-arrays in the permissionObj.

I need to do another condition in reduce function . For example , if Pubsidebar value is token is public, I want to keep static content {label: "test",value: "public"} without filtering with permissionObj and if other key and value is match with permissionObj,then it will be push inside token .

let permissionObj = [
  {
    'OA deal': [
      {
        label: 'can view',
        value: 'can_view',
      },
    ],
  },
  {
    Deposit: [
      {
        label: 'can edit',
        value: 'can_edit',
      },
    ],
  },
  {
    Deposit: [
      {
        label: 'can_view',
        value: 'can_view',
      },
    ],
  },

  {
    Journals: [
      {
        label: 'can create',
        value: 'can_create',
      },
    ],
  },
  {
    Dashboard: [
      {
        label: 'can view',
        value: 'can_view',
      },
    ],
  },
  {
    token: [
      {
        label: 'can view',
        value: 'can_create',
      },
    ],
  },
]

const PubSidebar = [
  {
    label: 'Dashboard',
    value: 'can_view',
  },
  {
    label: 'token',
    value: 'public',
    content: [
      {
        key: 'token',
        value: 'can_create',
      },
      {
        key: 'test',
        value: 'public',
      },
    ],
  },
  {
    label: 'OA deal',
    content: [
      {
        label: 'view oadeal',
        key: 'OA deal',
        value: 'can_view',
      },

      {
        label: 'Deposit',
        key: 'Deposit',
        value: 'can_view',
      },
      {
        label: 'Corrections',
        key: 'Corrections',
        value: 'can_edit',
      },
    ],
  },
  {
    label: 'Journals',
    content: [
      {
        label: 'Add Journal',
        key: 'Journals',
        value: 'can_create',
      },
    ],
  },
]

const filterObject = permissionObj.reduce((a, c) => {
  for (const key in c) {
    a[key] = c[key]
  }
  return a
}, {})
const result = PubSidebar.reduce((a, c) => {
  if (
    filterObject[c.label] &&
    c.value &&
    filterObject[c.label].some(s => s.value === c.value)
  ) {
    a.push(c)
  } else if (c.value === 'public' && c.label === 'token') {
    if (
      (c.content = c.content.filter(
        f =>
          filterObject[f.key] &&
          filterObject[f.key].some(s => s.value == f.value)
      ))
    ) {
      c.content = c.content.filter(
        f =>
          filterObject[f.key] &&
          filterObject[f.key].some(s => s.value == f.value)
      )
      a.push(c)
    }
  } else if (c.content.some(s => filterObject[s.key]) && c.content) {
    c.content = c.content.filter(
      f =>
        filterObject[f.key] && filterObject[f.key].some(s => s.value == f.value)
    )
    a.push(c)
  }

  return a
}, [])

console.log(result)

Here is code snippet . I am trying to getting public data from sidebar without filtering with permissionObj.

my expected output would : 
[
  {
    "label": "Dashboard",
    "value": "can_view"
  },
  {
    "label": "token",
    "value": "public",
    "content": [{
        "key": "test",
        "value": "public"
      }
      {
        "key": "token",
        "value": "can_create"
      }
    ]
  },
  {
    "label": "OA deal",
    "content": [
      {
        "label": "view oadeal",
        "key": "OA deal",
        "value": "can_view"
      },
      {
        "label": "Deposit",
        "key": "Deposit",
        "value": "can_view"
      }
    ]
  },
  {
    "label": "Journals",
    "content": [
      {
        "label": "Add Journal",
        "key": "Journals",
        "value": "can_create"
      }
    ]
  }
]

来源:https://stackoverflow.com/questions/61055773/how-to-filtering-array-of-objects-to-another-array-of-objects-in-js

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!