469,282 Members | 2,025 Online

# comparing values from two different arrays and finding the diff

Hi folks,

I am comparing two arrays and removing matches from the second array
from the first array.
Can someone take a look at this code below and mention if this is okay
and perhaps if there is a better way to achieve it

for(i=0;i<arrayA.length;i++){
for(j=0;j<arrayB.length;j++){
if(arrayA[i]==arrayB[j])
{
arrayA.splice(i,1);
}
}
}

cheers
Mahesh

Jul 27 '06 #1
1 7474 dated Thu, 27 Jul 2006 11:58:20 remote, seen in
news:comp.lang.javascript, ps******@gmail.com posted :
>I am comparing two arrays and removing matches from the second array
from the first array.
Can someone take a look at this code below and mention if this is okay
Probably not.
>and perhaps if there is a better way to achieve it
Certainly.
>for(i=0;i<arrayA.length;i++){
for(j=0;j<arrayB.length;j++){
if(arrayA[i]==arrayB[j])
{
arrayA.splice(i,1);
}
}
}
You have design & implementation faults.

In each J scan, arrayA[i] is looked up; that should be outside the J
loop.

In each I & J scan, .length is redetermined for every move. The length
of one array is constant; that of the other changes only at splice; the
lengths should be set into variables LA, LB.

More importantly, taking as an example the case of no matches, you do
two nested scans, taking time proportional to the product of the lengths
LA, LB. But if you can .sort the arrays, which takes less than time
L^2, you can then scan along the arrays in order looking for matches, as
in a merge sort.

If you scan backwards, using a while loop, then removing an element
will not affect the indexing of elements yet to be considered.
If the elements of the arrays necessarily take the form of identifiers,
or can be trivially converted to such (e.g. by prepending an 'X'), then
you can create from A a new Object, C, whose elements are named by the
values of A and whose values are unimportant. You can then scan B
similarly, looking to see if C already contains each element. The look-
ups must take size-dependent time, but will be efficient.

--