0

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}
]

3 Answers 3

1

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)
})
Sign up to request clarification or add additional context in comments.

Comments

0

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)

Comments

0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.