Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.javascript > #18723

Re: sort array

Message-ID <7839584.47tHrR2Uyp@PointedEars.de> (permalink)
From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Organization PointedEars Software (PES)
Date 2013-03-05 17:51 +0100
Subject Re: sort array
Newsgroups comp.lang.javascript
References <kh2lrk$ena$1@dont-email.me> <kh3ngq$jn4$1@speranza.aioe.org>

Show all headers | View raw


J.R. wrote:

> On 04/03/2013 14:33, Tony wrote:
>> I have an array called tempArray that consist of these fields
>> VesselID, ETATime, Gotref, Point
>>
>> When I want to sort on VesselID I use which works good
>> tempArray.sort(function (a, b)
>> {
>>         return a.VesselID - b.VesselID
>> })
>>
>>
>> Now I still want to sort on VesselID but within VesselID I also want to
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> sort on ETATime
   ^^^^^^^^^^^^^^^
>> ETATime which is of format YYYY/MM/DD hh:mm:ss
>>
>> How can I do that ?
> 
> Assuming that the ETATime string will always be in that format
> (yyyy/mm/dd hh:mm:ss), then we might use a function like this:
> 
> function sortETA(a, b) {
>    // a and b are strings representing a date-time
>    // of format yyyy/mm/dd hh:mm:ss
>    var e1, e2, re = /[/:\s]/g;
>    e1 = a.replace(re, ''); // converts to yyyymmddhhmmss
>    e2 = b.replace(re, ''); // idem
>    if (e1 === e2) { return 0; }
>    return (e1 < e2) ? -1 : 1;
> }
> 
> var arr = ['2013/03/06 10:23:01', '2013/03/05 23:59:01',
>             '2013/03/06 00:00:59', '2013/03/05 22:15:00'];
> 
> arr.sort(sortETA);

Or you could make Date objects out of the string values (see previous 
discussions) and sort those.  For example, if you can be sure that the 
implementation is one of ECMAScript Edition 5 or 5.1, you could replace “/” 
with “-” and “ ” with “T” and pass that to the Date constructor, because
the result is the simplified ISO 8601 time format supported by those 
implementations (ES 5.1, §15.9.1.5), and Date values of the same time zone 
sort easily because converting them to Number yields their time value (see 
also those discussions).

> However, you'd be better off testing for the expected ETA string format
> passed as the arguments to the sortETA(), using regular expressions:
> test whether you have the expected number of digits, spaces etc. for the
> date and time parts of the string)

Or you could get just the minimum clue and learn that this particular date 
format (with leading zeroes and fixed length) can be sorted as a string, 
i.e. *without* such an awfully *inefficient* user-defined comparator:

  var arr = ['2013/03/06 10:23:01', '2013/03/05 23:59:01',
             '2013/03/06 00:00:59', '2013/03/05 22:15:00'];
  arr.sort();

That said, due to your careless reading your answer does not address the 
question at all; which is basically how to sort using two sort keys (which 
should rather be a topic for “Programming 101”).  The simplest answer to 
that is, for example (for ascending order in both cases):

  tempArray.sort(function (a, b) {
    /* first key */
    var ax = a.x;
    var bx = b.x;

    if (ax < bx)
    {
      return -1;
    }

    if (ax > bx)
    {
      return 1;
    }

    /* else ax == bx */

    /* second key */
    var ay = a.y;
    var by = b.y;

    if (ay < by)
    {
      return -1;
    }

    if (ay > by)
    {
      return 1;
    }

    return 0;
  });

In this case it can be slightly optimized to

  tempArray.sort(function (a, b) {
    /* first key */
    var ax = a.x;
    var bx = b.x;

    /*
     * assuming ax and bx are Number values or convertible;
     * alternative:
     *
     *   var diff = ax - bx;
     *   if (diff) { return diff; }
     */
    if (ax != bx)
    {
      return ax - bx;
    }

    /* else ax == bx */

    /* second key, non-numeric */
    var ay = a.y;
    var by = b.y;

    if (ay < by)
    {
      return -1;
    }

    if (ay > by)
    {
      return 1;
    }

    return 0;
  });

Of course, thanks to the bracket property accessor and loops this can be 
generalized, which has been done before.  But apparently “Tony” could not 
care less and is continuing to fire off all his questions at this newsgroup 
in spite of documentation and previous discussions.
 
-- 
PointedEars

Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.

Back to comp.lang.javascript | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

sort array "Tony" <tony.johansson@inport.com> - 2013-03-04 18:33 +0100
  Re: sort array "Evertjan." <exxjxw.hannivoort@inter.nl.net> - 2013-03-04 19:19 +0100
  Re: sort array "J.R." <groups_jr-1@yahoo.com.br> - 2013-03-05 00:07 -0300
    Re: sort array Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2013-03-05 17:51 +0100
      Re: sort array "Joao Rodrigues (J.R.)" <groups_jr-1@yahoo.com.br> - 2013-03-09 02:33 -0300
        Re: sort array Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2013-03-09 13:01 +0100
  Re: sort array Dr J R Stockton <reply1300@merlyn.demon.co.uk.invalid> - 2013-03-05 21:10 +0000

csiph-web