O S
O S

Reputation: 169

JavaScript check if value of an array object is value of other array object

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

Answers (3)

J.F.
J.F.

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

Bouke
Bouke

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

pmiranda
pmiranda

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

Related Questions