0

Let's say I have two array of objects as,

let detail1 = [
    {'book':'LOTR','price':'14'}
    {'book':'Harry pottar','price':'12'},      
]

let detail2 = [
    {'book':'Harry pottar','price':'15'},
    {'book':'LOTR','Price':'14'},
    {'book':'HPP','Price':'21'}
]

I want to compare two array of objects and return true or false depending on whether they are same or not.

Note: object's structure i.e. key will always be same, their value may or may not change.

For this I tried as,

for(let i = 0 ;i<detail1.length; i++){
    for(let j = 0; j<detail2.length; j++){
        if(JSON.stringify(detail1[i]) === JSON.stringify(detail2[i])){
            boolValue = true
        } else {
            boolValue = false
        }
    }
}

But this is giving incorrect value for let's say I have another array of object as,

let detail1 = [
    {'book':'LOTR','price':'14'}
    {'book':'Harry pottar','price':'12'},      
]

let detail2 = [
    {'book':'Harry pottar','price':'12'},
    {'book':'LOTR','price':'14'}
]

But when order is changed it's giving incorrect value.

What is the possible solution to compare two array of object and return true if they are same and false if different for any cases given the structure of object i.e. key is same.

3
  • Because you are using stringify version to compare. You have to compare each and every property. Commented Oct 22, 2021 at 10:21
  • detail2[i] should be detail2[j], at least. Commented Oct 22, 2021 at 10:24
  • Does this answer your question? Comparing Arrays of Objects in JavaScript Commented Oct 22, 2021 at 10:55

2 Answers 2

4

You can't use JSON encoding for checking the equality, because it's order dependent, eg.:

console.log(
  JSON.stringify({'book':'LOTR','price':'14'}) == JSON.stringify({'price':'14', 'book':'LOTR'})
)

However you can do something like this:

let detail1 = [
    {'book':'LOTR','price':'14'},
    {'book':'Harry pottar','price':'12'},      
]

let detail2 = [
    {'book':'Harry pottar','price':'15'},
    {'book':'LOTR','Price':'14'},
    {'book':'HPP','Price':'21'}
]

function equal(a, b){
  return a.length == b.length && // same length and
         a.every( // every element in a
            e1 => b.some( // has a match in b
               e2 => e1.book == e2.book && e1.price == e2.price
            )
         )
}
console.log(equal(detail1,detail2), equal(detail1,detail1), equal(detail2,detail2))

As @T.J Crowder pointed out, you can actually avoid checking every entry of your object manually and just use Object.entries (be aware of using this only if your objects are composed by only key pair strings)

let detail1 = [
    {'book':'LOTR','price':'14'},
    {'book':'Harry pottar','price':'12'},      
]

let detail2 = [
    {'book':'Harry pottar','price':'15'},
    {'book':'LOTR','Price':'14'},
    {'book':'HPP','Price':'21'}
]

function equal(a, b){
  return a.length == b.length && // same length and
         a.every( // every element in a
            e1 => b.some( // has a match in b
               e2 => Object.keys(e1).every(key => e1[key] === e2[key])
            )
         )
}
console.log(equal(detail1,detail2), equal(detail1,detail1), equal(detail2,detail2))

Sign up to request clarification or add additional context in comments.

4 Comments

Well, that's saved me from writing an answer then. :-) Nice one!
@OP - If you wanted to avoid hardcoded property names (e.g., in a utility function), replace e2 => e1.book == e2.book && e1.price == e2.price with Object.keys(e1).every(key => e1[key] === e2[key]). But if this is just for these specific objects, I'd stick with the names as Alberto showed.
@T.J.Crowder ahah thanks man, yeah you are totally right, I'll add it immediately
Perfect! I cannot thank you enough :)
1

You can easily achieve the result using Object.keys and every

arr1.length !== arr2.length &&
    arr1.every((o, i) =>
      Object.keys(o).every((prop) => arr2[i][prop] && arr2[i][prop] === o[prop])
    )

let detail1 = [
  { book: "LOTR", price: "14" },
  { book: "Harry pottar", price: "12" },
];

let detail2 = [
  { book: "Harry pottar", price: "15" },
  { book: "LOTR", Price: "14" },
  { book: "HPP", Price: "21" },
];

function isEqual(arr1, arr2) {
  if (arr1.length !== arr2.length) return false;
  return arr1.every((o, i) => {
    return Object.keys(o).every((prop) => {
      return arr2[i][prop] && arr2[i][prop] === o[prop];
    });
  });
}

console.log(isEqual(detail1, detail2));

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.