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

356

    Vastaukset 10

    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. Hallituksen järjestämä spektaakkeli tuo vessanpyttykeissi

      Että olisi kymmenien kansanedustajien kodeissa käyty ihan tuosta vaan, eikä kukaan kansanedustaja kerro niin käyneen, va
      Maailman menoa
      305
      1205
    2. Sysmän "ilon päivä"

      Ja taas palaa hirveä määrä verorahoja, ihan turhaan soopaan. Eikö nämä jotka kuntapolitiikassa valittavat ja tuhoaa vaan
      Sysmä
      71
      855
    3. Uskon, että saataisiin kaikki selvitettyä

      Mutta yhteys on jäissä, minä olen jäässä, enkä osaa tai uskalla enää lähestyä. Se vaan on niin. Naiselta Jos ei ole hyvä
      Ikävä
      61
      783
    4. Pakko myöntää mies

      En mä aina ihan rehellinen sulle ollut
      Ikävä
      120
      673
    5. Joka ilta mietin

      sua❤️Mitä teet, missä meet? Kaipaatko yhtään? Yön tullen toivotan mielessäni sulle hyvää yötä ja aamuisin huomenet. Joka
      Ikävä
      38
      652
    6. Riitastako pelastaja

      Riitta jätti hakemuksen. Hyvä niin. On ainakin yksi mistä ottaa. Pertsa ei taida aikuistua koskaan ja Pekka hoiteli silt
      Kemijärvi
      41
      646
    7. mielikuva

      Mitä luulet hänen ajattelevan sinusta?
      Ikävä
      50
      596
    8. Timo Vornanen.

      On siinäkin yksi täystampio. Eipä ihme, että persukannattajat sen eduskuntaan äänestikin.
      Maailman menoa
      50
      566
    9. Luottamus

      Luotan vain siihen mitä tapahtuu IRL. Anonyymipalstan vihjailut eivät merkitse minulle mitään.
      Ikävä
      94
      535
    10. 45
      527
    11. Mikä kaivatullesi

      On tärkeintä elämässään?
      Ikävä
      37
      518
    12. 32
      511
    13. Kadutko mies sitä miten reagoit?

      ..siihen sotkuun, jonka jälkeen mikään ei ole ollut kuin ennen. 🥺
      Ikävä
      48
      505
    14. Millaisen talvitakin haluaisit?

      Talveen vielä aikaa, mutta talvitakit tulleet kauppoihin. Millainen olisi unelmiesi talvitakki? Itse tykkäisin jostain
      Sinkut
      79
      472
    15. Onko kahvila Retro samalla pub???

      Netin mukaan anniskeluoikeudet. Käykö tuolla kaljoitteluporukkaa? Onko iltaviihdettä? Olen muuttamassa marraskuussa Kuhm
      Kuhmo
      8
      437
    16. Tässä ovat Elämäni biisi -vieraat lauantai 3.10. - Yksi vieras on todellinen suomalaisten suosikki

      Jos menisit Elämäni biisiin, mikä olisi elämäsi biisi ja miksi? Elämäni biisi tulee suorana lähetyksenä Tampereelta. K
      Viihde ja kulttuuri
      9
      436
    17. Olisitko nainen ihan nolona

      Jos et saisikaan sitä nousemaan...
      Sinkut
      77
      432
    18. Kylypylä mätänee

      Kuka sotki uimaaltaan bakteereilla
      Suomussalmi
      19
      427
    19. Iivari esittää poliisin tutkintaa

      Siikalatvan kunnanjohtaja Pekka Iivari on pannu ison pyörän liikkeelle. Entinen Kemijärven historian lyhimmän kaupunginj
      Kemijärvi
      21
      401
    20. En voi kertoa meistä kenellekään

      Minulla on ikävä sinua mies.. Oon yrittänyt taas unohtaa, mutta silti tulet mieleeni lähes päivittäin. Eihän meitä voi o
      Ikävä
      27
      392
    Aihe