Path: csiph.com!usenet.pasdenom.info!weretis.net!feeder1.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: comp.lang.javascript Subject: Re: Difference between two arrays Date: Tue, 27 May 2014 17:21:21 +0200 Organization: PointedEars Software (PES) Lines: 84 Message-ID: <3407999.BczK8MDucV@PointedEars.de> References: Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1401204084 16440 eJwFwQkBACAIA8BKgAw1jjzrH8E7rNCo7YFwEJxkj7vsrW+gyXs97jFhUWx1og+854mWKe0DKS8RXA== (27 May 2014 15:21:24 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Tue, 27 May 2014 15:21:24 +0000 (UTC) User-Agent: KNode/4.12.4 X-User-ID: eJwNysERACAIA8GWFCVCORKg/xL0cZ+d04UJng3F1tZuruh08YzKuqJ7FMDoMhgHXP5ItxuJD6tOmPEnNTF5H4QaFnA= Cancel-Lock: sha1:5V6cTHfRBaZHNtpBWaqC7bx+dYk= X-NNTP-Posting-Host: eJwFwQkBACAIBLBKIn8cQK5/BDdlIxsXUxOFYrfZqvAiShwQgG4u9UnPc9m5ZWKz51U35AM4dhIr Xref: csiph.com comp.lang.javascript:24440 Andrew Poulos wrote: > If I have two "simple" arrays and I need to create a third array of > elements that are only in one of the arrays. I found this > > Array.prototype.difference = function (a) { > return this.filter(function (i) { This returns the elements of the calling array (“this”)… > return !(a.indexOf(i) > -1); … that are *not* in the array referred to by “a” (“a”). “i” is the value of the respective element of “this” in each call of the function. (I would label it “e” for “element” instead, to avoid confusion with the index.) If “i” is found in “a”, a.indexOf(i) returns the index of “i” in “a”. The index of standard arrays is always greater than -1 as it starts with 0. If “i” is not found in “a”, -1 is returned. Boolean-inverting the expression “a.indexOf(i) > -1” thus evaluates to “true” if “a.indexOf(i) > -1” evaluates to “false”, that is, if “i” was not found in “a”. Likewise, it evaluates to “false” if “a.indexOf(i) > -1” evaluates to “true”, that is, if “i” was found in “a”. > }); > }; > > which I don't fully understand but the issue with it that I have is that > I need to run it on both arrays to get all the differences. For example > > var arrX = [1, 2, 4, 6, 8], > arrY = [4, 8, 9]; > > var arrRes1 = arrX.difference(arrY)); // 1,2,6 > var arrRes2 = arrY.difference(arrX)); // 9 > > var arrRes = arrRes1.concat(arrRes2); // 1,2,6,9 There may be elements in array #1 that are not in array #2; for example, array #1 contains 1, 2 and 6 here which are not in array #2. Those are obtained if you run “difference()” on array #1 and pass array #2. There may also be elements in array #2 that are not in array #1; for example, array #2 contains 9 here which is not in array #1. Those are obtained if you run the method on array #2 and pass array #1. Logic (set theory) dictates that the elements of the sets A an B that are either in A or in B (which *you* call the “differences” between A and B) can be obtained by the union {A ∖ B} ∪ {B ∖ A} [{A \ B} U {B \ A} from here]: A \ B ,-'''''..'''''. :/1////:4 : : A :///2//: 8: 9 : B ://///6: : : '._____''____.' B \ A ,-'''''..'''''. : 1 :4 ://///: A : 2 : 8://9//: B : 6: ://///: '._____''____.' {A \ B} U {B \ A} ,-'''''..'''''. :/1////:4 ://///: A :///2//: 8://9//: B ://///6: ://///: '._____''____.' HTH -- PointedEars FAQ: | SVN: Twitter: @PointedEars2 | ES Matrix: Please do not Cc: me. / Bitte keine Kopien per E-Mail.