簡體   English   中英

如何在javascript中的子數組數組和子數組數組之間進行過濾?

[英]How to filtering between array of sub arrays and array of sub arrays in javascript?

我有兩個對象數組。 我想根據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對象數組過濾對象的數據數組。 這是我的嘗試代碼。

const permKeys = PermissionObj.permission.flatMap(item => Object.keys(item));
const filteredData = data.filter(({ label }) => permKeys.includes(label));
console.log(filteredData);

這是我的問題,我遇到的問題是,如果與期刊中的權限對象不匹配,我不想得到can_editcan_delete 在我的權限對象中, can_delete中沒有can_editcan_delete

我接受的輸出將是這種格式:

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

可以使用reduce方法並應用邏輯來決定應該推送哪些數據:

const result = data.reduce((a, c) => {
   let filterObj = PermissionObj.permission.find(f => f[c.label]);
   if (filterObj) {
      if (c.value) {
         a.push(c);
      }
      if (c.content) {
         c.content = c.content.filter(f => filterObj[c.label]
             .some(s => s.value.toLowerCase() == f.value.toLowerCase()));
         a.push(c);
      }
   }
   return a;
},[])

一個例子:

 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" }, { value:"can_view" } ] }, { label: "Articles", }, { label: "Journals", content: [ { value: "can_create" }, { value: "can_view" }, { value: "can_delete" }, { value: "can_edit" } ] } ]; const result = data.reduce((a, c) => { let filterObj = PermissionObj.permission.find(f => f[c.label]); if (filterObj) { if (c.value) { a.push(c); } if (c.content) { c.content = c.content.filter(f => filterObj[c.label].some(s => s.value.toLowerCase() == f.value.toLowerCase())); a.push(c); } } return a; },[]) console.log(result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM