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!
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.
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.
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
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
Object.entries(a)
/ Object.entries(b)
returns the contents of the objects.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..toString
returns a string representation of the object.===
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With