Compare and Array to an array of objects and return a part of the matched objects

Viewed 57

I have an array of objects below

const response = 
[
{
    id: 105,
    label: 'test',
    directories: [ '/api/1/directories/500' ]
  },
  {
    id: 337,
    label: 'test2',
    directories: [ '/api/1/directories/766' ]
  },
  {
    id: 200,
    label: 'test20',
    directories: [ '/api/1/directories/95' ]
  }
]

And I have an array called directories

directories = [ '/api/1/directories/766', '/api/1/directories/95' ]

I am trying to search/filter response to only return the ids of objects that matches the directories in directories array

so the sample output can be something like below, which is only the IDs of the matched objects

sampleOut= [337, 200]
5 Answers

This could be done as follows:

const out = response.filter(o => directories.includes(o.directories[0])).map(o => o.id);

Please have a look at the following runnable code snippet.

const response = [
  {
    id: 105,
    label: 'test',
    directories: [ '/api/1/directories/500' ]
  },
  {
    id: 337,
    label: 'test2',
    directories: [ '/api/1/directories/766' ]
  },
  {
    id: 200,
    label: 'test20',
    directories: [ '/api/1/directories/95' ]
  }
];

const directories = [ '/api/1/directories/766', '/api/1/directories/95' ];

const out = response.filter(o => directories.includes(o.directories[0])).map(o => o.id);
console.log(out)

const sampleOut = response.filter(response => directories.includes(response.directories[0]))
    .map(response => response.id);

You can use reduce and check exist by indexOf as

const response = 
[
{
    id: 105,
    label: 'test',
    directories: [ '/api/1/directories/500' ]
  },
  {
    id: 337,
    label: 'test2',
    directories: [ '/api/1/directories/766' ]
  },
  {
    id: 200,
    label: 'test20',
    directories: [ '/api/1/directories/95' ]
  }
]

directories = [ '/api/1/directories/766', '/api/1/directories/95' ];

var result = response.reduce((acc, item)=>{

  if(directories.indexOf(item.directories[0]) > -1){
    acc.push(item.id);
    
  }
  return acc;
},[]);

console.log(result);

You could do something like this.

const response = 
[
{
    id: 105,
    label: 'test',
    directories: [ '/api/1/directories/500' ]
  },
  {
    id: 337,
    label: 'test2',
    directories: [ '/api/1/directories/766' ]
  },
  {
    id: 200,
    label: 'test20',
    directories: [ '/api/1/directories/95' ]
  }
];

const directories = [ '/api/1/directories/766', '/api/1/directories/95' ];

const res = response.reduce((acc, elem)=>{
  if(directories.includes(elem.directories[0])){
    acc.push(elem.id)
  }
  return acc
},[]);

console.log(res)

You can iterate through the main array and pushing the propertie you want if there is a match:

const response = 
[
{
    id: 105,
    label: 'test',
    directories: [ '/api/1/directories/500' ]
  },
  {
    id: 337,
    label: 'test2',
    directories: [ '/api/1/directories/766' ]
  },
  {
    id: 200,
    label: 'test20',
    directories: [ '/api/1/directories/95' ]
  }
]

var directories = [ '/api/1/directories/766', '/api/1/directories/95' ]

var sampleOut = []

response.forEach(function(a) {
  if (directories.indexOf(a.directories[0]) >= 0 ) {
    sampleOut.push(a.id)
  }
})

console.log(sampleOut)

Related