Reputation: 169
let companies = [
{
"countryCode": "DEU",
"name": "Germany",
"companyFunctions": [
{
"name": "E-Commerce",
"companyName": "Company 1",
"divisionIds": ["3"]
}
]
},
{
"countryCode": "FRA",
"name": "France",
"companyFunctions": [
{
"name": "Support Services",
"companyName": "Company 2",
"divisionIds": ["3", "4"]
},
{
"name": "Procurement Support",
"companyName": "Company 3",
"divisionIds": ["1"]
}
]
}
]
let divisionIdsArr = [{ id: '1' }, { id: '2'}];
I want to return a new array of companies, where the divisionId of the company matches with any divisionIds
So in this case only the second object, as shown below, would be returned, because it's the only object that has divisionId that is in divisionIds
.
{
"countryCode": "FRA",
"name": "France",
"companyFunctions": [
{
"name": "Support Services",
"companyName": "Company 2",
"divisionIds": ["3", "4"]
},
{
"name": "Procurement Support",
"companyName": "Company 3",
"divisionIds": ["1"]
}
]
}
How can I accomplish this?
I tried doing the following:
companies.filter(c => c.companyFunctions.some(d => d.divisionIds.some(i => divisionIdsArr.includes(i))));
However, this doesn't work because divisionIdsArr
is an array of objects. So the includes()
fails here.
includes()
would work if the divisionIdsArr
looked something like:
let divisionIdsArr = ["1", "2"];
Upvotes: 0
Views: 84
Reputation: 15235
You can use map
or Array.from
to convert [{ id: '1' }, { id: '2'}]
into ["1", "2"]
.
Using Array.from
:
var result = companies.filter(c => c.companyFunctions.some(d => d.divisionIds.some(i => Array.from(divisionIds, x => x.id).includes(i))));
Also using map
is something like described into comments, using divisionIds.map(di => di.id)
instead of Array.from
.
companies.filter(c => c.companyFunctions.some(d => d.divisionIds.some(i => divisionIds.map(di => di.id).includes(i))));
So, clearer, your solution is to use:
companies.filter(
c => c.companyFunctions.some(
d => d.divisionIds.some(
i => YOUR_DESIRED_FUNCTION.includes(i))));
Where YOUR_DESIRED_FUNCTION
can be:
Array.from(divisionIds, x => x.id)
or
divisionIds.map(di => di.id)
Both do the same, convert [{ id: '1' }, { id: '2'}]
into ["1", "2"]
Example here:
let companies = [
{
"countryCode": "DEU",
"name": "Germany",
"companyFunctions": [{"name": "E-Commerce","companyName": "Company 1","divisionIds": ["3"]}]
},
{
"countryCode": "FRA",
"name": "France",
"companyFunctions": [
{"name": "Support Services","companyName": "Company 2","divisionIds": ["3", "4"]},
{"name": "Procurement Support","companyName": "Company 3","divisionIds": ["1"]}
]
}
]
let divisionIds = [{ id: '1' }, { id: '2'}];
var resultArray = companies.filter(
c => c.companyFunctions.some(
d => d.divisionIds.some(
i => Array.from(divisionIds, x => x.id).includes(i))));
var resultMap = companies.filter(
c => c.companyFunctions.some(
d => d.divisionIds.some(
i => divisionIds.map(di => di.id).includes(i))));
console.log(resultArray)
console.log("---------------------------")
console.log(resultMap)
console.log("---------------------------")
console.log(JSON.stringify(resultArray) === JSON.stringify(resultMap))
Upvotes: 1
Reputation: 1614
Easiest solution would be to change the division filter to simple id's instead of objects containing the id.
let divisionIds = ['1', '2'];
let result = companies.filter(c => c.companyFunctions.some(d => d.divisionIds.some(i => divisionIds.includes(i))));
console.log(result);
Upvotes: 2
Reputation: 8470
What about this:
https://jsfiddle.net/pmiranda/gpqLrv7c/13/
let companies = [
{
"countryCode": "DEU",
"name": "Germany",
"companyFunctions": [
{
"name": "E-Commerce",
"companyName": "Company 1",
"divisionIds": ["3"]
}
]
},
{
"countryCode": "FRA",
"name": "France",
"companyFunctions": [
{
"name": "Support Services",
"companyName": "Company 2",
"divisionIds": ["3", "4"]
},
{
"name": "Procurement Support",
"companyName": "Company 3",
"divisionIds": ["1"]
}
]
}
];
let divisionIdsArr = [{ id: '1' }, { id: '2'}];
let divisionIdsArValues = divisionIdsArr.map(a => a.id);
console.log(divisionIdsArValues);
let result = {};
companies.forEach( company => {
company.companyFunctions.forEach( companyFunction => {
// console.log(companyFunction);
companyFunction.divisionIds.forEach( div => {
// console.log(div);
if (divisionIdsArValues.includes(div)) {
console.log(company);
result = company;
}
})
})
});
console.log(result);
Upvotes: 1