Path: csiph.com!usenet.pasdenom.info!weretis.net!feeder1.news.weretis.net!feeder.erje.net!eu.feeder.erje.net!newsreader4.netcologne.de!news.netcologne.de!newsfeed.arcor.de!newsspool1.arcor-online.net!news.arcor.de.POSTED!not-for-mail Content-Type: text/plain; charset="UTF-8" Message-ID: <4320221.o7mTL0IePv@PointedEars.de> From: Thomas 'PointedEars' Lahn Reply-To: Thomas 'PointedEars' Lahn Organization: PointedEars Software (PES) Date: Fri, 03 May 2013 18:39:55 +0200 User-Agent: KNode/4.8.5 Content-Transfer-Encoding: 8Bit X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&. <12786665.ZbpLptdNGN@PointedEars.de> MIME-Version: 1.0 Lines: 140 NNTP-Posting-Date: 03 May 2013 18:39:57 CEST NNTP-Posting-Host: 66dae8f2.newsspool3.arcor-online.net X-Trace: DXC=1o8`[E@Z]D@j7E:bke<5HFMcF=Q^Z^V3H4Fo<]lROoRA8kF Thomas 'PointedEars' Lahn wrote: >> Scott Sauyet wrote: >>> You can probably achieve the same thing with this: >>> bookingArray.sort(function(a, b) { >>> return a.Objectid < b.Objectid ? -1 : >>> a.Objectid > b.Objectid ? +1 : >>> new Date(a.Fromtime) - new Date(b.Fromtime); >> >> (The “+” in “+1” is a superfluous conversion operation; it is *not* a >> no-op. > > ACK. > > But I choose to accept the very minor performance degradation in order > to keep the code more obvious, stressing that I'm returning a positive > number in one place and a negative in another. KISS: Numbers that have no negative sign are positive. (Yes, I know about zero.) >> Also, few people know that “-1” actually is a “unary -” conversion >> operation on the primitive Number value 1. See ES 5.1, §§ 11.4.6 and >> 11.4.7.) > > What's your evidence for that? I remember to have observed this misconception several times before. > I'm surprised to learn that few people know that. Do they expect it's > simply part of the number literal instead? Apparently so. I would expect many people to be surprised that var x = {-1: "foo"}; is syntactically wrong, while var x = {1: "foo"}; is correct, as it is somewhat counter-intuitive. (A number is a number, isn't it?) >> Please do not write or suggest such code; it is a maintenance nightmare. >> Write such code if you want your colleagues to dislike you for it, put >> politely. See also: > > While I do usually avoid nested ternary statements, this type of sort > function, because of their extreme simplicity, are often an exception. Of course. The problem is not the Conditional *Operator* (_not_ “ternary statements”). >> The least you should do is using parentheses to group the expressions to >> make it easier to read and to debug, for example (preferred by me) >> >> return (a.Objectid < b.Objectid >> ? -1 >> : (a.Objectid > b.Objectid >> ? 1 >> : new Date(a.Fromtime) - new Date(b.Fromtime))); >> >> or (preferred by others) >> >> return (a.Objectid < b.Objectid) >> ? -1 >> : (a.Objectid > b.Objectid) >> ? 1 >> : new Date(a.Fromtime) - new Date(b.Fromtime); > > I find both of those harder to read than my suggestion. Can you > suggest any objective criteria that makes those suggestions easier to > read or debug? Yes. As for reading, the parentheses make it clear what are either the conditional expressions or the conditions of those expressions. As for debugging, each value is on its own line, therefore this code is easier to debug step-by-step with debuggers that debug by line instead of by expression. >> var comparator = jsx.array.getComparator( >> ["Objectid", "Fromtime"], {numeric: true}); >> >> bookingArray.sort(comparator); >> >> (see >> ) > > That looks to be very useful. Thank you. >> or (more efficient here) >> >> bookingArray.sort(function (a, b) { >> return (a.Objectid - b.Objectid) || (a.Fromtime - b.Fromtime); >> }); > > See above. I'm guessing that `Fromtime` is a string. Previous threads started by the same person on the same problem (BTW a bad idea) suggest that it is a Number value. >> ______ >> ¹ However, this gives me the idea that it could be useful that >> jsx.array.getComparator() could also be passed a callback or constructor >> for each key, or all keys, whose return value would be used as operand >> in the comparison. What do you think? > > I'm not sure what you would mean by "or all keys" unless you mean for > each independently, Currently you can configure the sort method (numeric or generic), sort order (ascending or descending), and strictness (strict or loose equality) of the sorting both for each key separately and for all keys specified in the factory call. The same approach would be applied to the callback/constructor options. > but other than that, I can see that this would be a useful option. ACK > If the objects you want to sort have a property more complex than a String > or Number but that still has an intrinsic order, it would be nice to be > able to include that in your comparator. But rather than a > callback/constructor, how about recursively applying another comparator > for that key? I do not see how this could work. The elements of the Array are to be sorted by a property of the objects referred by the Array elements; the properties of the object's that are referred by the Array's elements are not to be modified. -- PointedEars Twitter: @PointedEars2 Please do not Cc: me. / Bitte keine Kopien per E-Mail.