как фильтровать массив объектов и вложенных массивов - 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_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: 'transction',
value:"public",content:[{label:"test2",value:"public"}]

},
      {
        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)

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

мой ожидаемый результат будет:

    [
      {
        "label": "Dashboard",
        "value": "can_view"
      },
{
            label: 'transction',
    value:"public",content:[{label:"test2",value:"public"}]

    },
      {
        "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"
          }
        ]
      }
    ]

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы можете добавить условие внутри метода reduce, и ваше свойство content не будет фильтроваться:

if (c.value ==='public' && c.content.some(f => filterObject[f.key] && 
    filterObject[f.key].some(s => s.value == f.value))) {
        a.push(c);
}

И попытаться избежать filter ваших данных внутри условия if.

Таким образом, код будет выглядеть так:

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

  {
    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.value ==='public' && c.content.some(f => filterObject[f.key] && filterObject[f.key].some(s => s.value == f.value))) {
          a.push(c);
      }
      else {
          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)
0 голосов
/ 06 апреля 2020

Я попытался сделать это с объектом, который вы указали в вопросе (missionsObj)

permissionObj.map( 
  p =>{  
    return { 
      label: Object.keys(p)[0], value:p[Object.keys(p)[0]][0].value 
    }
  }
)

, который обходит ключи и принимает первый в качестве метки, а первый объект подмассива - для получения значения

, что приводит к следующему:

[{"label":"OA deal","value":"can_view"},{"label":"Deposit","value":"can_view"},{"label":"Journals","value":"can_create"},{"label":"Dashboard","value":"can_view"},{"label":"token","value":"can_create"}]

некоторые данные, которые вам нужны, не указаны в allowObj, поэтому я не могу добавить это - поскольку я не знаю, откуда это взято

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...