[英]Filter array of objects if object contains attribute with value present in another array
我有以下對象數組。
const abc = [
{
sku: 1,
features: ["Slim"],
fields: [
{ label: "Material", value: "Material1" },
{ label: "Type", value: "Type1" },
]
},
{
sku: 2,
features: ["Cotton"],
fields: [
{ label: "Material", value: "Material2" },
{ label: "Type", value: "Type1" },
]
},
{
sku: 3,
features: ["Cotton"],
fields: [
{ label: "Material", value: "Material3" },
{ label: "Type", value: "Type2" },
]
}
];
我只想過濾那些特征和字段值存在於這個中的對象
const fieldsArr = ["Material1", "Material2", "Type1", "Slim"]
預期輸出為
let output = [
{
sku: 1,
features: ["Slim"],
fields: [
{ label: "Material", value: "Material1" },
{ label: "Type", value: "Type1" },
]
},
{
sku: 2,
features: ["Cotton"],
fields: [
{ label: "Material", value: "Material2" },
{ label: "Type", value: "Type1" },
]
},
]
我解決了這樣的功能部分
abc.forEach(e => {
if (e.features.some(v => fieldsArr.indexOf(v) !== -1)) {
output.push(e);
}
});
但是我在過濾字段部分時遇到了問題。 有沒有辦法以優化的方式根據上述條件過濾對象。
您還需要迭代嵌套數組。
const abc = [{ sku: 1, features: ["Slim"], fields: [{ label: "Material", value: "Material1" }, { label: "Type", value: "Type1" }] }, { sku: 2, features: ["Cotton"], fields: [{ label: "Material", value: "Material2" }, { label: "Type", value: "Type1" }] }, { sku: 3, features: ["Cotton"], fields: [{ label: "Material", value: "Material3" }, { label: "Type", value: "Type2" }] }], fieldsArr = ["Material1", "Material2", "Type1", "Slim"], result = abc.filter(({ features, fields }) => features.some(v => fieldsArr.includes(v)) || fields.some(({ value }) => fieldsArr.includes(value)) ); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用過濾器,並使用fieldsArr檢查每個項目的features
和fields
(值)的組合值。
const abc = [ { sku: 1, features: ["Slim"], fields: [ { label: "Material", value: "Material1" }, { label: "Type", value: "Type1" } ] }, { sku: 2, features: ["Cotton"], fields: [ { label: "Material", value: "Material2" }, { label: "Type", value: "Type1" } ] }, { sku: 3, features: ["Cotton"], fields: [ { label: "Material", value: "Material3" }, { label: "Type", value: "Type2" } ] } ]; const fieldsArr = ["Material1", "Material2", "Type1", "Slim"]; const res = abc.filter(item => [...item.features, ...item.fields.map(x => x.value)].some(fea => fieldsArr.includes(fea) ) ); console.log(res); // Update: more concise using destructure const res2 = abc.filter(({features, fields}) => [...features, ...fields.map(({value}) => value)].some(fea => fieldsArr.includes(fea) ) ); console.log(res2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.