当前位置: 首页 > 面试题库 >

如何在JavaScript中将对象数组过滤为另一个对象数组?

陈高寒
2023-03-14
问题内容

我有两个对象数组。我想基于PermissionObj过滤数据。

这是即将形成的数据库。这是permissionObj中的子数组的数组。

    const PermissionObj = {
     permission: [{
       "books": [{
        "label": "Can View",
        "value": "can_view"
       }]
      },
      {
       "Journals": [{
         "label": "Can View",
         "value": "can_view"
        },
        {
         "label": "Can Create",
         "value": "can_create"
        },
       ]
      },
      {
       "deal": [{
         "label": "Can update",
         "value": "can_update"
        },
        {
         "label": "Can delete",
         "value": "can_delete"
        },
       ]
      }
     ]
    }

这是静态数据。我想比较基于PermissionObj的数据。

const data = [{
  label: "books",
  value: "can_view"
 },
 {
  label: "deal",
  content: [{

   value: "can_update"
  }, {
   value: "can_delete"
  },{value:"can_view"}]
 },
 {
  label: "Articles",

 },
 {
  label: "Journals",
  content: [{
    value: "can_create"
   },
   {
    value: "can_view"
   },
  {
    value: "can_delete"
   },
 {
    value: "can_edit"
   },

  ]
 }
]

我正在尝试基于 对象PermissionObj数组 过滤 对象数据数组 。这是我尝试的代码。

let permission = PermissionObj.permission

permission.filter(item=>{
  // I am finding data label by using permission label.

 let dataItem = data.find(index=>item[index.label])

 console.log(dataItem)

})

  // the problem is that I want to filtering based on value .

  // if both of value is true , then show the data .

如果PermissionObj值将与data值匹配。然后显示数据。
我接受的输出将是这种格式:

const data = [{
  label: "books",
  value: "can_view"
 },
 {
  label: "deal",
  content: [{
   value: "can_update"
  }, {
   value: "can_delete"
  }]
 },
 {
  label: "Journals",
  content: [{
    value: "can_create"
   },
   {
    value: "can_view"
   },


  ]
 }
]

问题答案:

首先keys从PermissionObj 构建。在标签包含的数据数组上使用过滤器keys

const PermissionObj = {

  permission: [

    {

      books: [

        {

          label: "Can View",

          value: "can_view"

        }

      ]

    },

    {

      Journals: [

        {

          label: "Can View",

          value: "can_view"

        },

        {

          label: "Can Create",

          value: "can_create"

        }

      ]

    },

    {

      deal: [

        {

          label: "Can update",

          value: "can_update"

        },

        {

          label: "Can delete",

          value: "can_delete"

        }

      ]

    }

  ]

};



const data = [

  {

    label: "books",

    value: "can_view"

  },

  {

    label: "deal",

    content: [

      {

        value: "can_update"

      },

      {

        value: "can_delete"

      }

    ]

  },

  {

    label: "Articles"

  },

  {

    label: "Journals",

    content: [

      {

        value: "can_create"

      },

      {

        value: "can_view"

      }

    ]

  }

];



const perm = {};

PermissionObj.permission.forEach(item =>

  Object.entries(item).forEach(([key, values]) => {

    perm[key] = values.map(x => x.value);

  })

);



const updated = data

  .map(item => {

    const newItem = {

      ...item

    };

    if (item.content) {

      newItem.content = item.content.filter(x =>

        perm[item.label].includes(x.value)

      );

    } else if (item.value) {

      newItem.value = perm[item.label].includes(item.value) ? item.value : "";

    }

    return newItem;

  })

  .filter(x => x.content || x.value);



console.log(updated);


 类似资料:
  • 问题内容: 我有一个对象数组: 如何通过JavaScript将其转换为以下内容? 问题答案: 您可能正在寻找这样的东西:

  • 问题内容: 我有两个阵列。我正在用PubSidebar过滤基于groupKey。 如果父母重视:日记或存款或任何价值或角色:公共,我在传递内容数组内的对象时遇到问题。我必须在基于的内容数组中传递值。 如果存在Journals and Deposits,则在内容数组内添加Journals and Deposit数据,包括公共数据。(三个对象) 如果存在Journals,则将Contents数组内的J

  • 问题内容: 假设我有一个像这样的数组 但我想将其转换为这样的对象: 能做到吗?我尝试过的所有方法都只会获得最后一个键值对。 问题答案: 如果您使用的是ES6或更高版本:

  • 问题内容: 我有一系列对象,我想知道搜索它的最佳方法。给定以下示例,我如何搜索和?jQuery有什么可以帮助的吗?还是我必须自己蛮力搜​​索? 问题答案: 您可以使用:

  • 我有这样的数据响应 然后我想把颜色推到物品里面 预期:每个索引项有三(3)个变量 我尝试使用push和concat,但出现错误“无法读取未定义的属性“数据” 这是我的密码

  • 问题内容: 我有一个数组模型如下: 现在我有了一个Empid的数组。 所以现在我需要过滤第一个包含第二个中所有键的数组。 输出: 我可以使用循环进行此操作,但是由于我的模型对象中有100多个记录。我需要如何更好地处理此问题的建议。 我正在考虑创建一个自定义过滤器,但是您对此有何看法(如果可以,请提供示例代码来实现此目的)。 感谢您的帮助。 谢谢。 问题答案: 你可以做到这一点, 如果返回一个值,则