at least one of the value's in the array1 obj "data" array matches the "data" array in array2 object
> array1
array1 = [
{
id: '1',
name: 'ron',
data: ['p1']
},
{
id: '2',
name: 'lon',
data: ['p2']
},
{
id: '3',
name: 'voon',
data: ['p4']
}
];
> array2
array2 = [
{
id: '1',
name: 'fgr',
data:['p1','p2','p3']
},
{
id: '2',
name: 'gone',
data:['p1','p2','p3']
}
]
output: { id: '1', name: 'ron', data: ['p1'] }, { id: '2', name: 'lon', data: ['p2'] }
CodePudding user response:
With the below assumption:
array1has objects each of which always have propdatawhich is an arrayarray2also has objects and these objects will always have propdatawhich is an array as well- the desired objective is to generate an array with objects from
array1whosedatahave at least one common element with any of thedataofarray2objects.
this solution may work:
const findNeedleInHaystack = (needle = array1, haystack = array2) => (
needle.reduce((acc, itm) => (
haystack
.map(x => x.data)
.flat()
.some(x => itm.data.includes(x))
? [...acc, itm]
: [...acc]
), [])
);
Explanation
- iterate over the
needlearray (ie, array1) using.reduce - use
.maponhaystackarray (ie, array2) to separate thedatafrom each object - use
.flat()to transform the 2-dimensional resulting array into 1-dimension - use
.someto see if any element in the 1-dimensional array is also present initm'sdataarray - if found, concatenate
itmto the result (using...spread operator onacc- the aggregator/accumulator) - if not found, skip concatenating
itm.
Code Snippet
const array1 = [
{
id: '1',
name: 'ron',
data: ['p1']
},
{
id: '2',
name: 'lon',
data: ['p2']
},
{
id: '3',
name: 'voon',
data: ['p4']
}
];
const array2 = [
{
id: '1',
name: 'fgr',
data:['p1','p2','p3']
},
{
id: '2',
name: 'gone',
data:['p1','p2','p3']
}
];
const findNeedleInHaystack = (needle = array1, haystack = array2) => (
needle.reduce((acc, itm) => (
haystack.map(x => x.data).flat().some(x => itm.data.includes(x))
? [...acc, itm]
: [...acc]
), [])
);
console.log(findNeedleInHaystack());
