Home > Back-end >  How to filter array of objects by another array of objects by property using javascript
How to filter array of objects by another array of objects by property using javascript

Time:11-24

I have two nested array of objects, how to compare two array of objects by

id from arrobj1 and assignId from arrobj2 using javascript

So, I would to know how to compare array of objects by id and assignId and return array of objects using javascript


Tried

const result =  arrobj1.filter(arr1 => {
       arrobj2.find(arr2 => arr2.assignId === arr1.id)
    });

var arrobj1 =[
 {id: 1, name: 'xxx', value:100},
 {id: 2, name: 'yyy', value:200},
 {id: 3, name: 'zzz', value:400}
]

var arrobj2 =[
 {country: 'IN', name: 'lina', assignId:2},
 {country: 'MY', name: 'john', assignId:3},
 {country: 'SG', name: 'peter', assignId:6}
]

Expected Code:

[
 {id: 2, name: 'yyy', value:200},
 {id: 3, name: 'zzz', value:400}
]

CodePudding user response:

You have it almost correct, but you need to return in your filter, either by explicitly adding the return keyword or by removing the braces to use the arrow function's implicit return:

const result = arrobj1.filter(arr1 =>
  arrobj2.find(arr2 => arr2.assignId === arr1.id)
)
// or
const result = arrobj1.filter(arr1 => {
  return arrobj2.find(arr2 => arr2.assignId === arr1.id)
})

CodePudding user response:

We can combine Array.filter() and Array.some() to make it more simple

let result = arrobj1.filter(a1 => arrobj2.some(a2 => a2.assignId === a1.id) )
console.log(result)

For your code,the reason is that you have missing return when invoke find

var arrobj1 =[
 {id: 1, name: 'xxx', value:100},
 {id: 2, name: 'yyy', value:200},
 {id: 3, name: 'zzz', value:400}
]

var arrobj2 =[
 {country: 'IN', name: 'lina', assignId:2},
 {country: 'MY', name: 'john', assignId:3},
 {country: 'SG', name: 'peter', assignId:6}
]

let result = arrobj1.filter(a1 => arrobj2.some(a2 => a2.assignId === a1.id) )
console.log(result)

CodePudding user response:

You can generally go with the filter and some combination as @flyingfox mentioned in the answer, But if you'd have thousands of records then your time complexity would increase which you can solve by removing the nested some loop.

So more performant code would look like the following for a bigger data set.

And yes, Either use return with braces or simply remove the braces for one-liner returns!

var arrobj1 = [
    { id: 1, name: 'xxx', value: 100 },
    { id: 2, name: 'yyy', value: 200 },
    { id: 3, name: 'zzz', value: 400 },
]

var arrobj2 = [
    { country: 'IN', name: 'lina', assignId: 2 },
    { country: 'MY', name: 'john', assignId: 3 },
    { country: 'SG', name: 'peter', assignId: 6 },
]

var obj = {}
for (const elem of arrobj2) {
    obj[elem.assignId] = true
}

let result = arrobj1.filter((a1) => obj[a1.id])
console.log(result)

  • Related