Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.javascript > #18723
| 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> |
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
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