sorting an array

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Michael Hill

    sorting an array

    If I have an array defined like this:

    var list = [
    ["1","359"," No a Test xxxxxxxxxxxxxxx ","
    0","08/18/2003","Approved "],
    ["2","268"," test character fields for 500
    ","129","07/14/2003","Approved "],
    ["3","288","text area filled XXXXXXXx","
    0","07/15/2003","Approved "]
    ];

    How would I sort it by the 3th column?

    Mike

  • Lasse Reichstein Nielsen

    #2
    Re: sorting an array

    Michael Hill <hillmw@ram.lmt as.lmco.com> writes:
    [color=blue]
    > If I have an array defined like this:
    >
    > var list = [
    > ["1","359"," No a Test xxxxxxxxxxxxxxx ","
    > 0","08/18/2003","Approved "],[/color]

    Please avoid line breaks when posting code. The code, as posted, is
    invalid.

    Try this:
    ---
    function compare(a,b) {
    if (a<b) {return -1;}
    if (a>b) {return 1;}
    return 0;
    }

    var sortedList = list.sort(funct ion(a,b){return compare(a[2],b[2]);});
    ---

    /L
    --
    Lasse Reichstein Nielsen - lrn@hotpop.com
    DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleD OM.html>
    'Faith without judgement merely degrades the spirit divine.'

    Comment

    • Douglas Crockford

      #3
      Re: sorting an array

      > If I have an array defined like this:[color=blue]
      >
      > var list = [
      > ["1","359"," No a Test xxxxxxxxxxxxxxx ","
      > 0","08/18/2003","Approved "],
      > ["2","268"," test character fields for 500
      > ","129","07/14/2003","Approved "],
      > ["3","288","text area filled XXXXXXXx","
      > 0","07/15/2003","Approved "]
      > ];
      >
      > How would I sort it by the 3th column?[/color]

      You can pass a function to the array.sort(fn) method.

      list.sort(funct ion (a, b) {
      if (a[2] == b[2]) {
      return 0;
      }
      if (a[2] < b[2]) {
      return -1;
      }
      return 1;
      });

      // 15.4.4.11


      Comment

      • Evertjan.

        #4
        Re: sorting an array

        Douglas Crockford wrote on 01 dec 2003 in comp.lang.javas cript:
        [color=blue]
        > list.sort(funct ion (a, b) {
        > if (a[2] == b[2]) {
        > return 0;
        > }
        > if (a[2] < b[2]) {
        > return -1;
        > }
        > return 1;
        > });
        >[/color]

        In short:

        list.sort(
        function(a,b) {
        return (a[2]>b[2])?1:(a[2]<b[2])?-1:0
        }
        );


        --
        Evertjan.
        The Netherlands.
        (Please change the x'es to dots in my emailaddress)

        Comment

        • Douglas Crockford

          #5
          Re: sorting an array

          > > list.sort(funct ion (a, b) {[color=blue][color=green]
          > > if (a[2] == b[2]) {
          > > return 0;
          > > }
          > > if (a[2] < b[2]) {
          > > return -1;
          > > }
          > > return 1;
          > > });
          > >[/color]
          >
          > In short:
          >
          > list.sort(
          > function(a,b) {
          > return (a[2]>b[2])?1:(a[2]<b[2])?-1:0
          > }
          > );[/color]

          Or shorter,

          list.sort(funct ion(a,b){return (a[2]>b[2])?1:(a[2]<b[2])?-1:0});

          Comment

          • Lasse Reichstein Nielsen

            #6
            Re: sorting an array

            "Douglas Crockford" <nospam@covad.n et> writes:
            [color=blue]
            > Or shorter,
            >
            > list.sort(funct ion(a,b){return (a[2]>b[2])?1:(a[2]<b[2])?-1:0});[/color]

            Or even shorter, and much uglier,
            list.sort(funct ion(a,b){return a[2]<b[2]?-1:+(a[2]>b[2]);});

            And the original was still by far the most readable.
            /L
            --
            Lasse Reichstein Nielsen - lrn@hotpop.com
            DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleD OM.html>
            'Faith without judgement merely degrades the spirit divine.'

            Comment

            • Evertjan.

              #7
              Re: sorting an array

              Douglas Crockford wrote on 01 dec 2003 in comp.lang.javas cript:
              [color=blue][color=green][color=darkred]
              >> > list.sort(funct ion (a, b) {
              >> > if (a[2] == b[2]) {
              >> > return 0;
              >> > }
              >> > if (a[2] < b[2]) {
              >> > return -1;
              >> > }
              >> > return 1;
              >> > });
              >> >[/color]
              >>
              >> In short:
              >>
              >> list.sort(
              >> function(a,b) {
              >> return (a[2]>b[2])?1:(a[2]<b[2])?-1:0
              >> }
              >> );[/color]
              >
              > Or shorter,
              >
              > list.sort(funct ion(a,b){return (a[2]>b[2])?1:(a[2]<b[2])?-1:0});[/color]

              Even shorter:

              list.sort(funct ion(a,b){return (c=a[2]-b[2])?(c>0)?1:-1:0});

              --
              Evertjan.
              The Netherlands.
              (Please change the x'es to dots in my emailaddress)

              Comment

              • Douglas Crockford

                #8
                Re: sorting an array

                > >> > list.sort(funct ion (a, b) {[color=blue][color=green][color=darkred]
                > >> > if (a[2] == b[2]) {
                > >> > return 0;
                > >> > }
                > >> > if (a[2] < b[2]) {
                > >> > return -1;
                > >> > }
                > >> > return 1;
                > >> > });
                > >> >
                > >>
                > >> In short:
                > >>
                > >> list.sort(
                > >> function(a,b) {
                > >> return (a[2]>b[2])?1:(a[2]<b[2])?-1:0
                > >> }
                > >> );[/color]
                > >
                > > Or shorter,
                > >
                > > list.sort(funct ion(a,b){return (a[2]>b[2])?1:(a[2]<b[2])?-1:0});[/color]
                >
                > Even shorter:
                >
                > list.sort(funct ion(a,b){return (c=a[2]-b[2])?(c>0)?1:-1:0});[/color]

                That assumes that the values are numbers. If they are, then

                list.sort(funct ion(a,b){return a[2] - b[2]});

                Comment

                • Evertjan.

                  #9
                  Re: sorting an array

                  Lasse Reichstein Nielsen wrote on 02 dec 2003 in comp.lang.javas cript:
                  [color=blue][color=green]
                  >> Or shorter,
                  >>
                  >> list.sort(funct ion(a,b){return (a[2]>b[2])?1:(a[2]<b[2])?-1:0});[/color]
                  >
                  > Or even shorter, and much uglier,
                  > list.sort(funct ion(a,b){return a[2]<b[2]?-1:+(a[2]>b[2]);});[/color]

                  Haha:

                  list.sort(funct ion(a,b){return +((c=a[2]-b[2])>0)-(c<0)});

                  Ugliness is a joy forever in the hand of the beholder.

                  --
                  Evertjan.
                  The Netherlands.
                  (Please change the x'es to dots in my emailaddress)

                  Comment

                  • Lasse Reichstein Nielsen

                    #10
                    Re: sorting an array

                    "Evertjan." <exjxw.hannivoo rt@interxnl.net > writes:
                    [color=blue]
                    > list.sort(funct ion(a,b){return +((c=a[2]-b[2])>0)-(c<0)});[/color]

                    That requires a[2] and b[2] to be numbers. Comparison works for
                    strings too, and the original poster's example had strings at offset
                    2.

                    (And as it was pointed out, if they are numbers,
                    list.sort(funct ion(a,b){return a[2]-b[2];});
                    is sufficient).

                    /L
                    --
                    Lasse Reichstein Nielsen - lrn@hotpop.com
                    DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleD OM.html>
                    'Faith without judgement merely degrades the spirit divine.'

                    Comment

                    • Evertjan.

                      #11
                      Re: sorting an array

                      Lasse Reichstein Nielsen wrote on 02 dec 2003 in comp.lang.javas cript:
                      [color=blue]
                      > And as it was pointed out, if they are numbers,
                      > list.sort(funct ion(a,b){return a[2]-b[2];});
                      > is sufficient[/color]

                      True.

                      Not according to the specs, but I do not find that very important.

                      ==============

                      So for strings, and without an if or ?: clause, we are stuck with:

                      return +(a[2]<b[2])-(a[2]>b[2])

                      ==============

                      Internally machine coded in a comparison, the three possiblilities must be
                      available as a "triary" and reduced to a binary output. Silly higher
                      languages.

                      --
                      Evertjan.
                      The Netherlands.
                      (Please change the x'es to dots in my emailaddress)

                      Comment

                      • Lasse Reichstein Nielsen

                        #12
                        Re: sorting an array

                        "Evertjan." <exjxw.hannivoo rt@interxnl.net > writes:
                        [color=blue]
                        > So for strings, and without an if or ?: clause, we are stuck with:
                        >
                        > return +(a[2]<b[2])-(a[2]>b[2])[/color]

                        That's cute!
                        [color=blue]
                        > Internally machine coded in a comparison, the three possiblilities must be
                        > available as a "triary" and reduced to a binary output. Silly higher
                        > languages.[/color]

                        I miss Perl's <=> operator :)

                        /L
                        --
                        Lasse Reichstein Nielsen - lrn@hotpop.com
                        DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleD OM.html>
                        'Faith without judgement merely degrades the spirit divine.'

                        Comment

                        • Lasse Reichstein Nielsen

                          #13
                          Re: sorting an array

                          Lasse Reichstein Nielsen <lrn@hotpop.com > writes:
                          [color=blue]
                          > "Evertjan." <exjxw.hannivoo rt@interxnl.net > writes:[/color]
                          [color=blue][color=green]
                          >> return +(a[2]<b[2])-(a[2]>b[2])[/color]
                          >
                          > That's cute![/color]

                          It should actually be the other way around (to sort increasingly):
                          return (a[2]>b[2])-(a[2]<b[2]);
                          (and you can omit the +, since "-" converts both arguments to numbers)

                          /L
                          --
                          Lasse Reichstein Nielsen - lrn@hotpop.com
                          DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleD OM.html>
                          'Faith without judgement merely degrades the spirit divine.'

                          Comment

                          • Dr John Stockton

                            #14
                            Re: sorting an array

                            JRS: In article <Xns944563C16B7 FDeejj99@194.10 9.133.29>, seen in
                            news:comp.lang. javascript, Evertjan. <exjxw.hannivoo rt@interxnl.net >
                            posted at Tue, 2 Dec 2003 08:48:22 :-
                            [color=blue]
                            >So for strings, and without an if or ?: clause, we are stuck with:
                            >
                            >return +(a[2]<b[2])-(a[2]>b[2])[/color]

                            For those using W3's TIDY to check the Web page, and I recommend doing
                            so, that needs to be at least
                            return +(a[2]< b[2])-(a[2]>b[2])

                            in order not to risk confusing TIDY (if using the same version as I do).
                            The combination LessThan Letter seems to be taken as requiring a closing
                            GreaterThan, unless the traditional <!-- and --> are used.

                            Nicer:
                            return +( a[2] < b[2] ) - ( a[2] > b[2] )

                            However, I do not see how the + is needed.

                            --
                            © John Stockton, Surrey, UK. ?@merlyn.demon. co.uk Turnpike v4.00 IE 4 ©
                            <URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang. javascript
                            <URL:http://www.merlyn.demo n.co.uk/js-index.htm> JS maths, dates, sources.
                            <URL:http://www.merlyn.demo n.co.uk/> TP/BP/Delphi/JS/&c., FAQ topics, links.

                            Comment

                            Working...