簡體   English   中英

如何過濾 object 的數組並根據另一個數組過濾掉值? 過濾應該基於鍵而不是值

[英]How to filter array of object and filter out values based on another array? Filtering should happen based on keys not values

我有一個 object 數組,必須基於另一個數組進行過濾,鍵列在允許的數組中,請幫助使用 object.entries 並減少但沒有用

const filter = _.filter;
const data = [{
    id: 1,
    row: [{
        id: 'a',
        name: 'ab',
        code: 'sdf',
        version: 1
      },
      {
        id: 'b',
        name: 'bc',
        code: 'def',
        version: 3
      },
      {
        id: 'c',
        name: 'cd',
        code: 'afd',
        version: 2
      },
    ]
  },
  {
    id: 2,
    row: [{
        id: 'd',
        name: 'ef',
        code: 'sdf',
        version: 1
      },
      {
        id: 'e',
        name: 'gh',
        code: 'def',
        version: 3
      },
      {
        id: 'f',
        name: 'ij',
        code: 'afd',
        version: 2
      },
    ]
  },
  {
    id: 3,
    row: [{
        id: 'g',
        name: 'kl',
        code: 'asd',
        version: 2
      },
      {
        id: 'h',
        name: 'mn',
        code: 'faf',
        version: 3
      },
      {
        id: 'i',
        name: 'op',
        code: 'dfs',
        version: 1
      },
    ]
  }
]

const allowed = ['id', 'name']

let result = [{
    id: 1,
    row: [{
        id: 'a',
        name: 'ab'
      },
      {
        id: 'b',
        name: 'bc'
      },
      {
        id: 'c',
        name: 'cd'
      },
    ]
  },
  {
    id: 2,
    row: [{
        id: 'd',
        name: 'ef'
      },
      {
        id: 'e',
        name: 'gh'
      },
      {
        id: 'f',
        name: 'ij'
      },
    ]
  },
  {
    id: 3,
    row: [{
        id: 'g',
        name: 'kl'
      },
      {
        id: 'h',
        name: 'mn'
      },
      {
        id: 'i',
        name: 'op'
      },
    ]
  }
]

result = data.filter(el => el.row.filter(elm => Object.fromEntries(allowed.map(k => [k, elm[k]]))));

console.log(result);

您可以使用Array.map創建一個新數組。

邏輯

  • Map 通過陣列。
  • 只需傳播運算符以分離出行鍵和鍵的row
  • 返回一個 object 與 rest 的鍵和行鍵與Object.fromEntries

 const data = [{ id: 1, row: [ { id: 'a', name: 'ab', code: 'sdf', version: 1 }, { id: 'b', name: 'bc', code: 'def', version: 3 }, { id: 'c', name: 'cd', code: 'afd', version: 2 }, ] }, { id: 2, row: [ { id: 'd', name: 'ef', code: 'sdf', version: 1 }, { id: 'e', name: 'gh', code: 'def', version: 3 }, { id: 'f', name: 'ij', code: 'afd', version: 2 }, ] }, { id: 3, row: [ { id: 'g', name: 'kl', code: 'asd', version: 2 }, { name: 'mn', code: 'faf', version: 3 }, { id: 'i', name: 'op', code: 'dfs', version: 1 }, ] } ] const allowed = ['id', 'name']; const result = data.map(({ row, ...rest }) => { return {...rest, row: row.map(elm => Object.fromEntries(allowed.map(k => [k, elm[k]]))) } }); console.log(result);

很長的路要走,但它有效:

 const data = [ {id: 1, row: [ {id: 'a', name: 'ab', code: 'sdf', version: 1}, {id: 'b', name: 'bc', code: 'def', version: 3}, {id: 'c', name: 'cd', code: 'afd', version: 2}, ] }, {id: 2, row: [ {id: 'd', name: 'ef', code: 'sdf', version: 1}, {id: 'e', name: 'gh', code: 'def', version: 3}, {id: 'f', name: 'ij', code: 'afd', version: 2}, ] }, {id: 3, row: [ {id: 'g', name: 'kl', code: 'asd', version: 2}, {id: 'h', name: 'mn', code: 'faf', version: 3}, {id: 'i', name: 'op', code: 'dfs', version: 1}, ] } ]; const allowed = ['id', 'name']; let res = []; data.forEach((el) => { let obj = {}; obj.id = el.id; obj["row"] = []; let row = buildArray(el.row); obj["row"].push(row); res.push(obj); }) function buildArray(row) { r = {}; allowed.forEach((k) => { r[k] = row[0][k]; }) return r; } console.log(res)

暫無
暫無

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

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