Using jQuery to compare two arrays of Javascript objects Using jQuery to compare two arrays of Javascript objects arrays arrays

Using jQuery to compare two arrays of Javascript objects


There is an easy way...

$(arr1).not(arr2).length === 0 && $(arr2).not(arr1).length === 0

If the above returns true, both the arrays are same even if the elements are in different order.

NOTE: This works only for jquery versions < 3.0.0 when using JSON objects


I was also looking for this today and found:http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256BFB0077DFFD

Don't know if that's a good solution though they do mention some performance considerations taken into account.

I like the idea of a jQuery helper method.@David I'd rather see your compare method to work like:

jQuery.compare(a, b)

I doesn't make sense to me to be doing:

$(a).compare(b)

where a and b are arrays. Normally when you $(something) you'd be passing a selector string to work with DOM elements.

Also regarding sorting and 'caching' the sorted arrays:

  • I don't think sorting once at the start of the method instead of every time through the loop is 'caching'. The sort will still happen every time you call compare(b). That's just semantics, but...
  • for (var i = 0; t[i]; i++) { ...this loop finishes early if your t array contains a false value in it somewhere, so $([1, 2, 3, 4]).compare([1, false, 2, 3]) returns true!
  • More importantly the array sort() method sorts the array in place, so doing var b = t.sort() ...doesn't create a sorted copy of the original array, it sorts the original array and also assigns a reference to it in b. I don't think the compare method should have side-effects.

It seems what we need to do is to copy the arrays before working on them. The best answer I could find for how to do that in a jQuery way was by none other than John Resig here on SO! What is the most efficient way to deep clone an object in JavaScript? (see comments on his answer for the array version of the object cloning recipe)

In which case I think the code for it would be:

jQuery.extend({    compare: function (arrayA, arrayB) {        if (arrayA.length != arrayB.length) { return false; }        // sort modifies original array        // (which are passed by reference to our method!)        // so clone the arrays before sorting        var a = jQuery.extend(true, [], arrayA);        var b = jQuery.extend(true, [], arrayB);        a.sort();         b.sort();        for (var i = 0, l = a.length; i < l; i++) {            if (a[i] !== b[i]) {                 return false;            }        }        return true;    }});var a = [1, 2, 3];var b = [2, 3, 4];var c = [3, 4, 2];jQuery.compare(a, b);// falsejQuery.compare(b, c);// true// c is still unsorted [3, 4, 2]


My approach was quite different - I flattened out both collections using JSON.stringify and used a normal string compare to check for equality.

I.e.

var arr1 = [             {Col: 'a', Val: 1},              {Col: 'b', Val: 2},              {Col: 'c', Val: 3}           ];var arr2 = [             {Col: 'x', Val: 24},              {Col: 'y', Val: 25},              {Col: 'z', Val: 26}           ];if(JSON.stringify(arr1) == JSON.stringify(arr2)){    alert('Collections are equal');}else{    alert('Collections are not equal');}

NB: Please note that his method assumes that both Collections are sorted in a similar fashion, if not, it would give you a false result!