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]
-
Does this answer your question? Javascript find json valueMihail Minkov– Mihail Minkov2020年06月07日 04:31:32 +00:00Commented Jun 7, 2020 at 4:31
5 Answers 5
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)
answered Jun 7, 2020 at 4:34
uminder
26.4k6 gold badges45 silver badges91 bronze badges
Sign up to request clarification or add additional context in comments.
Comments
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);
answered Jun 7, 2020 at 4:39
Hien Nguyen
19k7 gold badges57 silver badges70 bronze badges
const sampleOut = response.filter(response => directories.includes(response.directories[0]))
.map(response => response.id);
Comments
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)
answered Jun 7, 2020 at 4:51
ABGR
5,2634 gold badges34 silver badges56 bronze badges
Comments
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)
answered Jun 7, 2020 at 4:32
djcaesar9114
2,1472 gold badges30 silver badges51 bronze badges
Comments
lang-js