首页 > 解决方案 > 如何将对象数组过滤到js中的另一个对象数组?

问题描述

我有两个对象数组。我想根据permissionObj 过滤数据。

这是来自数据库。这是permissionObj 中的子数组数组。

我需要在 reduce 函数中做另一个条件。例如,如果 Pubsidebar 的值是令牌是公共的,我想保留静态内容 {label: "test",value: "public"} 而不用permissionObj 过滤,如果其他键和值与permissionObj 匹配,那么它将被推送里面的令牌。

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)

这是代码片段。我正在尝试从侧边栏获取公共数据而不使用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"
      }
    ]
  }
]

标签: javascriptarraysfunctionobjectreduce

解决方案


推荐阅读