簡體   English   中英

過濾對象數組並刪除對象是過濾器返回空值

[英]Filter array of objects and remove object is filter returns empty values

這是我的問題。 我有一個對象數組,如下所示。 每個對象都有一個標題和行。 rows也是具有risk值的對象數組,例如 P1、P2、P3 等。我想過濾並僅獲取risk等於P1的那些行。 在某些對象中,P1 可能根本沒有風險。 在這種情況下,我想完全忽略該對象。

let data = [ 
    {
        "title": "QA",
        "rows": [
            {
                "risk": "P3",
                "Title": "Permission issue",
            }
        ]
    }, 
    {
        "title": "Prod",
        "rows": [
            {
                "risk": "P5",
                "Title": "Console log errors fix",
            },
            {
                "risk": "P1",
                "Title": "Server is in hung state",
            }
        ]
    }
]

我想要的結果如下。 如您所見,標題QA根本沒有 P1。 所以我想忽略整個對象。

    {
        "title": "Prod",
        "rows": [
            {
                "risk": "P1",
                "Title": "Server is in hung state",
            }
        ]
    }
]

我嘗試使用此代碼。 但是這樣做的問題是,帶有 QA 的標題會被添加到最終輸出中,即使它沒有任何 P1 風險。

let result = input.map((obj) => ({
  ...obj,
  rows: obj.rows.filter((row) => row.risk === "P1"),
}));

有人可以讓我知道如何使用 P1 過濾對象,如果其中沒有 P1,則跳過整個對象。

您可以使用函數Array.prototype.filter過濾掉那些沒有風險的對象 === "P1" 。

 const data = [ { "title": "QA", "rows": [ { "risk": "P3", "Title": "Permission issue", } ] }, { "title": "Prod", "rows": [ { "risk": "P5", "Title": "Console log errors fix", }, { "risk": "P1", "Title": "Server is in hung state", } ] }], result = structuredClone(data).filter(o => { o.rows = o.rows.filter(({risk}) => risk === "P1"); return !!o.rows.length; }); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

我會完全跳過地圖,只使用過濾器:

const result = data.filter((obj) => {
  let includesP1 = false;
  obj.rows.forEach((r) => {
    if (r.risk === "P1") includesP1 = true;
  });
  return includesP1;
});

您可以根據具有 P1 風險的行建立一個新列表。

data.reduce((acc, item) => {
  const rows = item.rows.filter(it => it.risk === 'P1');
  if (rows.length === 0) return acc;
  return [...acc, {...item, rows }]
}, [])

使用reduce可以過濾掉所有非 P1 風險。

 const data = [ { title: "QA", rows: [{ risk: "P3", Title: "Permission issue" }] }, { title: "Prod", rows: [ { risk: "P5", Title: "Console log errors fix" }, { risk: "P1", Title: "Server is in hung state" }, ], }, ]; const result = data.reduce((acc, d) => { const rows = d.rows.filter(({ risk }) => risk === "P1"); if (rows.length) { acc.push({ ...d, rows }); } return acc; }, []); console.log(result);

另一種方法

您也可以先過濾至少有一個P1風險的數據,然后從過濾后的數據中刪除所有非P1風險。

 const data = [ { title: "QA", rows: [{ risk: "P3", Title: "Permission issue" }] }, { title: "Prod", rows: [ { risk: "P5", Title: "Console log errors fix" }, { risk: "P1", Title: "Server is in hung state" }, ], }, ]; const result = data .filter(({ rows }) => rows?.some(({ risk }) => risk === "P1")) .map((d) => ({ ...d, rows: d.rows.filter(({ risk }) => risk === "P1") })); console.log(result);

相關文件:

這可以按如下方式完成:


  // function to check if a row has risk P1
  const hasRiskP1 = (row) => { return row.risk === 'P1' };

  // first filter out all rows which do not contain P1
  // then filter out all entries which do not have any rows left 
  const result = data.map(entry => ({...entry, ...{rows: entry.rows.filter(hasRiskP1)}}))
                     .filter(entry => entry.rows.length);

暫無
暫無

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

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