Как фильтровать массив объектов в другой массив объектов в js? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть два массива объектов. Я хочу отфильтровать данные, основываясь на разрешении Obj.

Это исходит из базы данных. Вот массивы подмассивов в разрешении Obj.

Мне нужно выполнить другое условие в функции Reduce. Например, если значение Pubsidebar является токеном publi c, я хочу сохранить stati c content {label: "test", значение: "publi c"} без фильтрации с разрешениемObj, и если другой ключ и значение имеют значение сопоставьте с разрешением Obj, тогда внутри токена будет pu sh.

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)

Вот фрагмент кода. Я пытаюсь получить publi c данные из боковой панели без фильтрации с разрешения Obj.

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"
      }
    ]
  }
]
...