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