Extra points for higher-order function, although that is going to be
O(n^2) (unless Array.indexOf() has a weird implementation). If you've
got really, really big arrays (or are doing this in a tight loop) and
you have O(n) memory to spare, you could consider building a hashmap of
the values in Array a, and then walking Array b and checking if each
element is in the hashmap:

var differs:Boolean = (a.length != b.length);
if (!differs) {
  var aContents = new Object();
  a.forEach(function(item:Object, index:int, array:Array):void {
    aContents[item] = true;
  });
  differs = b.some(function(item:Object, index:int, array:Array):Boolean
{
    return aContents[item] == null;
  });
}

For small-ish arrays, though, I would expect your solution to be faster
than mine (I won't define 'small-ish', since I would honestly be pulling
a number out of my--err, out of thin air).

Also, neither your solution nor mine handles the case where the same
item is in one array twice (yours fails for dupes in a and mine for
dupes in b).

-- 
Maciek Sakrejda
Truviso, Inc.
http://www.truviso.com

-----Original Message-----
From: Sergey Kovalyov <[EMAIL PROTECTED]>
Reply-To: [email protected]
To: [email protected]
Subject: [flexcoders] What is the best way to compare two arrays element
by element ignoring the order?
Date: Fri, 22 Feb 2008 15:37:56 +0200

What is the best way to compare two arrays element by element ignoring
the order? My solution:

var differs : Boolean =
 (a.length != b.length) ||
 a.some(
  function(item : Object, index : int, array : Array) : Boolean {
   return (b.indexOf(item) == -1);
  });

May be the better solution exists?


 


Reply via email to