我有两个数组:
国家代码
:
[
{
"countryCode": "DEU",
"name": "Germany",
"companyFunctions": [
{
"name": "E-Commerce",
"companyName": "Company 1"
}
]
},
{
"countryCode": "FRA",
"name": "France",
"companyFunctions": [
{
"name": "Shopping Centre",
"companyName": "Company 1"
},
{
"name": "Support Services",
"companyName": "Company 2"
},
{
"name": "Procurement Support",
"companyName": "Company 3"
},
{
"name": "Retail",
"companyName": "Company 3"
}
]
}
]
和filterarr
:
[
{
"name": "Company 2",
"id": "32434d324-32434"
},
{
"name": "Company 3",
"id": "2643d3254-39244"
}
]
我要做的是通过循环遍历Countriesarr
数组来筛选Countriesarr
,其中Countriesarr.companyFunctions.companyName===filterarr.name
。
我编写了如下代码:
countriesArr.filter(p =>
p.companyFunctions.filter(cF =>
filterArr.filter(c => c.name === cF.companyName)
)
);
但这似乎不起作用,因为它还返回来自countriesarr
的德国对象,并且它在来自countriesarr
的法语对象的companyfunctions
中包含company1
,而company1
不在filterarr
中。
我做错了什么?
所需的结果应如下所示:
[
{
"countryCode": "FRA",
"name": "France",
"companyFunctions": [
{
"name": "Support Services",
"companyName": "Company 2"
},
{
"name": "Procurement Support",
"companyName": "Company 3"
},
{
"name": "Retail",
"companyName": "Company 3"
}
]
}
]
null
const countriesArr = [
{
countryCode: 'DEU',
name: 'Germany',
companyFunctions: [
{
name: 'E-Commerce',
companyName: 'Company 1',
},
],
},
{
countryCode: 'FRA',
name: 'France',
companyFunctions: [
{
name: 'Shopping Centre',
companyName: 'Company 1',
},
{
name: 'Support Services',
companyName: 'Company 2',
},
{
name: 'Procurement Support',
companyName: 'Company 3',
},
{
name: 'Retail',
companyName: 'Company 3',
},
],
},
];
const filterArr = [
{
name: 'Company 2',
id: '32434d324-32434',
},
{
name: 'Company 3',
id: '2643d3254-39244',
},
].map((f) => f.name);
const result = countriesArr
.map((c) => ({
...c,
companyFunctions: c.companyFunctions.filter((cf) => filterArr.includes(cf.companyName)),
}))
.filter((c) => c.companyFunctions.length > 0);
console.log(result);
如果CompanyFunctions
包含所需的名称,则可以重新生成新对象。
null
const
countriesArr = [{ countryCode: "DEU", name: "Germany", companyFunctions: [{ name: "E-Commerce", companyName: "Company 1" }] }, { countryCode: "FRA", name: "France", companyFunctions: [{ name: "Shopping Centre", companyName: "Company 1" }, { name: "Support Services", companyName: "Company 2" }, { name: "Procurement Support", companyName: "Company 3" }, { name: "Retail", companyName: "Company 3" }] }],
filterArr = [{ name: "Company 2", id: "32434d324-32434" }, { name: "Company 3", id: "2643d3254-39244" }],
names = filterArr.reduce((r, { name }) => (r[name] = true, r), {}),
result = countriesArr.reduce((r, { companyFunctions, ...o }) => {
companyFunctions = companyFunctions.filter(({ companyName }) => names[companyName]);
if (companyFunctions.length) r.push({ ...o, companyFunctions });
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您需要的不是countriesarr
上的筛选器,而是map()(用于转换它),然后是filter()(用于删除具有0个companyFunctions的条目),反之亦然(首先是filter()那些至少有一个匹配的CompanyFunction
,然后是map用于转换,删除不需要的条目)。 但映射然后过滤对我来说更简单。。。
const result = countriesArr
.map(function(ca) {
ca.companyFunctions = ca.companyFunctions.filter(
cf => filterArr.some(fa=>fa.name==cf.companyName)
);
return ca;
})
.filter(ca=>ca.companyFunctions.length)
;
console.log(JSON.stringify(result, null, 4));
// [
// {
// "countryCode": "FRA",
// "name": "France",
// "companyFunctions": [
// {
// "name": "Support Services",
// "companyName": "Company 2"
// },
// {
// "name": "Procurement Support",
// "companyName": "Company 3"
// },
// {
// "name": "Retail",
// "companyName": "Company 3"
// }
// ]
// }
// ]