过滤对象数组并删除对象,过滤返回空值



我的问题是。我有一个如下所示的对象数组。每个对象都有一个标题和行。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。

您可以基于具有P1风险行的列表构建一个新列表。

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

你可以过滤掉那些没有风险的对象=== "Array.prototype.filter.

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;
});

使用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);

相关文件:

  • Array.prototype.reduce
  • Array.prototype.filter
  • Array.prototype.push
  • Array.prototype.some
  • Array.prototype.map

可以这样做:


// 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);