JavaScript ja MyArray.sort() ei onnistu

Anonyymi

var MyArray = ["25.12.2013 16:20", "29.06.2018 11:12", "13.06.2016 15:55", "14.10.2017 10:35", "19.07.2020 21:02", "19.07.2020 21:17"]
console.log( MyArray.sort() )

Nuo järjestyy väärin, kuinka tämä pitäisi tehdä ?

10

313

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Ihan ne oikein järjestyy, koska ovat merkkijonoja. Jos aikajärjestystä haet, niin pitää muuntaa ensin aika-arvoiksi.

      • Anonyymi

        Jos ajat on aina tuossa muodossa, niin ei tarvitse edes käyttää mitään aika-kirjaston funktioiota, vaan voi summailla suoraan vertailuluvun. Tässä versiossa lisäsin vertailuluvun uuten taulukkoon alkuperäisen merkkijonon kanssa. Sen jälkeen sortataan vertailulluvun perusteella ja lopuksi näytetään alkuperäiset merkkijonot.

        const myArray = ["25.12.2013 16:20", "29.06.2018 11:12", "13.06.2016 15:55", "14.10.2017 10:35", "19.07.2020 21:02", "19.07.2020 21:17"]
        let ajat=myArray.map(aika => {
        const [paivamaara,kellonaika] = aika.split(' ');
        const [paiva,kuukausi,vuosi] = paivamaara.split('.');
        const [tunti,minuutti] = kellonaika.split(':');
        const summa = parseInt(vuosi kuukausi paiva tunti minuutti);
        return { 'alkuperäinen': aika, 'vertailuarvo': summa };
        });
        console.log((ajat.sort((a,b) => a.vertailuarvo-b.vertailuarvo)).map(x => x['alkuperäinen']));

        Tuloste:
        [
        '25.12.2013 16:20',
        '13.06.2016 15:55',
        '14.10.2017 10:35',
        '29.06.2018 11:12',
        '19.07.2020 21:02',
        '19.07.2020 21:17'
        ]


      • Anonyymi
        Anonyymi kirjoitti:

        Jos ajat on aina tuossa muodossa, niin ei tarvitse edes käyttää mitään aika-kirjaston funktioiota, vaan voi summailla suoraan vertailuluvun. Tässä versiossa lisäsin vertailuluvun uuten taulukkoon alkuperäisen merkkijonon kanssa. Sen jälkeen sortataan vertailulluvun perusteella ja lopuksi näytetään alkuperäiset merkkijonot.

        const myArray = ["25.12.2013 16:20", "29.06.2018 11:12", "13.06.2016 15:55", "14.10.2017 10:35", "19.07.2020 21:02", "19.07.2020 21:17"]
        let ajat=myArray.map(aika => {
        const [paivamaara,kellonaika] = aika.split(' ');
        const [paiva,kuukausi,vuosi] = paivamaara.split('.');
        const [tunti,minuutti] = kellonaika.split(':');
        const summa = parseInt(vuosi kuukausi paiva tunti minuutti);
        return { 'alkuperäinen': aika, 'vertailuarvo': summa };
        });
        console.log((ajat.sort((a,b) => a.vertailuarvo-b.vertailuarvo)).map(x => x['alkuperäinen']));

        Tuloste:
        [
        '25.12.2013 16:20',
        '13.06.2016 15:55',
        '14.10.2017 10:35',
        '29.06.2018 11:12',
        '19.07.2020 21:02',
        '19.07.2020 21:17'
        ]

        Taas sinä teit sen, HIENOA.

        Olin jo luovuttamassa, ettei tuota saa kuin muuttamalla hankalasti minuutit, tunnit, päivät, kuukaudet, vuodet sekunneiksi ja summaamalla kaikki yhteen. Tekemällä taulukon, jossa on molemmat tavat ilmaista tuo aika, ja järjestelemällä jotenkin se sitten sekuntien mukaiseen järjestykseen ja niin edelleen, ja edelleen ....

        Kyllä on hyvä että mukana on nero jolla kaikki onnistuu, KIITOS SINULLE.


    • Anonyymi

      Hyvä ja selkeä ratkaisu jo tulikin, mutta tässä olisi vielä vähän toisella tavalla. Parsitaan pvm säännöllisellä lausekkeella ja muodostetaan parsituista luvuista Date-oliot ja vertaillaan niitä (tai niistä koersioituja lukuja).

      const getVertailuluku = s => {
      let _,d,M,Y,h,m;
      [_,d,M,Y,h,m] = /(..)[.](..)[.](....) (..):(..)/g.exec(s);
      return new Date( Y, M-1, d, h, m, 0); // edessä muutta lukuarvoksi, kuukausi on 0:sta lähtevä, joten vähennetään yksi
      };

      ["25.12.2013 16:20", "29.06.2018 11:12", "13.06.2016 15:55", "14.10.2017 10:35", "19.07.2020 21:02", "19.07.2020 21:17"].sort((a,b)=>getVertailuluku(a)-getVertailuluku(b))

      Tuossa tuo säännöllinen lauseke on juuri tuolle muodolle räätälöity. Jos jotain esim. eri välimerkkejä haluaisi sallia, niin voisi kokeilla jotain tyyliin

      /([0-9] )[^0-9] ([0-9] )[^0-9] ([0-9] )[^0-9] ([0-9] )[^0-9] ([0-9] )/g

      • Anonyymi

        Hyvä huomio ettei ole pakko tehdä kopiota taulukosta. Tein myös suoraan käytettävän vertailufunktion tuosta omasta versiosta ja aika paljon lyhentyi koodi.

        Pastebinissä, kun foorumin automaattipoisto hävittää jostain syystä.
        https://pastebin.com/rc37CK9e


      • Anonyymi
        Anonyymi kirjoitti:

        Hyvä huomio ettei ole pakko tehdä kopiota taulukosta. Tein myös suoraan käytettävän vertailufunktion tuosta omasta versiosta ja aika paljon lyhentyi koodi.

        Pastebinissä, kun foorumin automaattipoisto hävittää jostain syystä.
        https://pastebin.com/rc37CK9e

        Joo, tämän minä kerkisinkin kopioida talteen, ennen kuin poistettiin, tästä se tuskin lyhenee. Hyvä, ellei vieläkin parempi. Yllätti kuinka moni pystyi noinkin vaikean tapauksen ratkaisemaan.


      • Anonyymi
        Anonyymi kirjoitti:

        Hyvä huomio ettei ole pakko tehdä kopiota taulukosta. Tein myös suoraan käytettävän vertailufunktion tuosta omasta versiosta ja aika paljon lyhentyi koodi.

        Pastebinissä, kun foorumin automaattipoisto hävittää jostain syystä.
        https://pastebin.com/rc37CK9e

        Toisaalta, jos vertailufunktion arvoja ei tallenneta, niin se joudutaan laskemaan useampaan kertaan (n*log(n)-algoritmihän se sort on). Noh, jos taulukko ei ole kovin iso, niin eipä sillä ole väliä.
        Optimaalisinta olisi kai tallentaa ensin vertailufunktion arvo propertiksi, mutta nyt kun kyseessä on merkkijonot, niin se ei onnistu. Onnistuisi jos ne olisi String-objekteja eli luotu koodilla new String("25.12.2020 16:24");


    • Anonyymi

      Joku kirjoitti aika yksinkertaisen keinon järjestää taulukko aikajärjestykseensä, mutta viesti poistettiin käsittämättömästä syystä. Ei huolta kerkisin ottaa talteen sen helpomman näköisen tavan siitä (4 riviä). Toista (alimmaista) osuutta en kerinnyt.

      • Anonyymi

        Tuossa versio missä järjestetty taulukko missä taulukoita.

        const taulukko = [
        [ "25.12.2013 16:20", "eka" ],
        [ "29.06.2018 11:12", "toka" ],
        [ "13.06.2016 15:55", "koka" ],
        [ "14.10.2017 10:35", "neki" ],
        [ "19.07.2020 21:02", "viki" ],
        [ "19.07.2020 21:17", "kuki" ]
        ];

        const aikaArvo = (aika) => {
        const [paiva,kuukausi,vuosi,tunti,minuutti] = aika.split(/[.' ':]/g);
        return parseInt(vuosi kuukausi paiva tunti minuutti);
        }
        console.log((taulukko.sort((a,b) => aikaArvo(a[0])-aikaArvo(b[0]))));

        Tuloste:
        [
        [ '25.12.2013 16:20', 'eka' ],
        [ '13.06.2016 15:55', 'koka' ],
        [ '14.10.2017 10:35', 'neki' ],
        [ '29.06.2018 11:12', 'toka' ],
        [ '19.07.2020 21:02', 'viki' ],
        [ '19.07.2020 21:17', 'kuki' ]
        ]


      • Anonyymi
        Anonyymi kirjoitti:

        Tuossa versio missä järjestetty taulukko missä taulukoita.

        const taulukko = [
        [ "25.12.2013 16:20", "eka" ],
        [ "29.06.2018 11:12", "toka" ],
        [ "13.06.2016 15:55", "koka" ],
        [ "14.10.2017 10:35", "neki" ],
        [ "19.07.2020 21:02", "viki" ],
        [ "19.07.2020 21:17", "kuki" ]
        ];

        const aikaArvo = (aika) => {
        const [paiva,kuukausi,vuosi,tunti,minuutti] = aika.split(/[.' ':]/g);
        return parseInt(vuosi kuukausi paiva tunti minuutti);
        }
        console.log((taulukko.sort((a,b) => aikaArvo(a[0])-aikaArvo(b[0]))));

        Tuloste:
        [
        [ '25.12.2013 16:20', 'eka' ],
        [ '13.06.2016 15:55', 'koka' ],
        [ '14.10.2017 10:35', 'neki' ],
        [ '29.06.2018 11:12', 'toka' ],
        [ '19.07.2020 21:02', 'viki' ],
        [ '19.07.2020 21:17', 'kuki' ]
        ]

        Kiitos.


    Ketjusta on poistettu 5 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. SDP jo 100 % suositumpi kuin persut

      Kertoo Hesarin uusin kannatuskysely. Demareiden kannatus on miltei tuplat verrattuna persuihinl. Suomen kansa ei selväst
      Maailman menoa
      136
      10868
    2. Voiko normaali ihminen ryhtyä vasemmistolaiseksi?

      Tätä jäin pohdiskelemaan.
      Maailman menoa
      264
      4726
    3. SDP haluaa 40 000 nettomaahanmuuttajaa

      SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah
      Maailman menoa
      178
      4059
    4. Mikä tämä henkilö mahtaa touhuta Parkanossa

      Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58
      Parkano
      53
      3584
    5. Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen

      No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat
      Maailman menoa
      184
      3559
    6. PS ylivoimainen nousija myös HS:n gallupissa, SDP laskee taas

      https://www.verkkouutiset.fi/a/hs-gallup-sdpn-suosio-laskee-ps-nousussa/#0a7d2507 Ylivoimainen viime kuukausien nousija
      Maailman menoa
      96
      3413
    7. Ikävä sinua mies

      Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i
      Ikävä
      32
      3200
    8. Valtavasti suomalaisia asunnottomina, mutta ei yhtään somalia

      tai muuta kehitysmaalaista. Mites tässä näin kävi? Tiedän hyvin, että esim. somaleita lentää ulos mm. Hekan asunnoista,
      Maailman menoa
      86
      3197
    9. Hienoa! Eduskunta luopui käteisen käytöstä

      Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.
      Maailman menoa
      69
      1874
    10. Kiinnostaa - ei kiinnosta - kiinnostaapas

      Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt
      Sinkut
      205
      1804
    Aihe