Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fastest way to compare 2 objects in js

Which is the fastest way to compare 2 objects in javascript?

For example I have these 2 objects:

a = [{'name': 'john', 'age': 22}, {'name': 'mike', 'age': 23}, {'name': 'anne', 'age': 12}, {'name': 'dan', 'age': 29}, {'name': 'jane', 'age': 34}]
b = [{'name': 'john', 'age': 22}, {'name': 'anne', 'age': 12}]

Normally, I would do this:

for (var i = 0; i < a.length; i++) {
    for (var j = 0; j < b.length; j++) {
        console.log(a[i]) // => [{'name': 'john', 'age': 22}, {'name': 'anne', 'age': 12}]
    }
}

This is taking too long, is it there another way faster? Thank you for your time!

like image 283
Tenzolinho Avatar asked Jan 21 '19 14:01

Tenzolinho


People also ask

What is the best way to compare objects in JavaScript?

Comparing objects is easy, use === or Object.is(). This function returns true if they have the same reference and false if they do not. Again, let me stress, it is comparing the references to the objects, not the keys and values of the objects. So, from Example 3, Object.is(obj1,obj2); would return false.

Can you check if two objects are equal JavaScript?

In JavaScript, we cannot directly compare two objects by equality operators (double equals == or triple equals ===) to see whether they are equal or not. Comparing two objects like this results in false even if they have the same data.


2 Answers

You can have a look at the fast-deep-equal package. Here is a performance benchmark from their README.md for your reference.

fast-deep-equal x 226,960 ops/sec ±1.55% (86 runs sampled)
nano-equal x 218,210 ops/sec ±0.79% (89 runs sampled)
shallow-equal-fuzzy x 206,762 ops/sec ±0.84% (88 runs sampled)
underscore.isEqual x 128,668 ops/sec ±0.75% (91 runs sampled)
lodash.isEqual x 44,895 ops/sec ±0.67% (85 runs sampled)
deep-equal x 51,616 ops/sec ±0.96% (90 runs sampled)
deep-eql x 28,218 ops/sec ±0.42% (85 runs sampled)
assert.deepStrictEqual x 1,777 ops/sec ±1.05% (86 runs sampled)
ramda.equals x 13,466 ops/sec ±0.82% (86 runs sampled)
The fastest is fast-deep-equal
like image 173
Isaac Avatar answered Sep 18 '22 14:09

Isaac


I don't have enough rep to add a comment to explain Neha Mundra's answer [below] so thought I'd post instead.

let a={a:20,b:10};
let b={b:10,a:20};

console.log(Object.entries(a).sort().toString()===
            Object.entries(b).sort().toString()) //true
  1. Object.entries(a) / Object.entries(b) returns the contents of the objects
  2. .sort() orders them by key value (a/b), as you can see in the example the keys are reversed when declared, this will ensure they are in the same order for comparison.
  3. .toString returns a string representation of the object.
  4. The === operator is checking for equality of both strings.

Hope that might help someone. This can also be checked in your browsers dev console, if you're not sure what's going on.

like image 22
Chris Avatar answered Sep 17 '22 14:09

Chris