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

329

    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. Hallitus pyrkii rajoittamaan kaupan omien halpamerkkien myyntiä

      Helsingin Sanomien mukaan hallitus valmistelee lakihanketta, joka suitsii kaupan valtaa ja rajoittaa omien halpamerkkien
      Yhteiskunta
      245
      3709
    2. Tapettu

      On joku kangaskadulla perjantaina
      Sotkamo
      58
      3503
    3. Björn Wahlroos, maataloustuet lakkautettava

      Sanoo pankkimies. Mitäs persut ja muut tukinulliem perskärpäset tähän? "Wahlroos listaa kansallisen maataloustuen. – I
      Maailman menoa
      96
      2905
    4. Persut päättivät hiilivoiman kieltämisestä Suomessa

      Moni on jo unohanut kuka hyväksyi hiilivoimaloiden kieltämisen Suomessa: persut Sukupuolineutraalit liikennemerkitk
      Maailman menoa
      51
      2680
    5. Työvoimatoimisto

      Nyt kysyisin miksi pitää käydä työvoimatoimistossa paikanpäällä, kun he eivät muuta tee kuin laittavat koneelle uudet ve
      Työttömyys
      120
      2466
    6. Nalle Wahlroos ei ulise kuten Teemu Selänne sähkölaskuista

      Nalle "hah hah" nauroi saamistaan sähkötuista, kun taas Teemu-poika itkeä tirautti kovasta sähkön hinnasta. Nalle nauro
      Maailman menoa
      35
      2082
    7. Muistattekos kuinka kokoomus ja persut vinkuivat sähkön hinnasta?

      Oppositiossa vuonna 2022, kun sähkön hinta uhkasi nousta 20 senttiin kilowattitunnilta? Nyt ovat hiiren hiljaa, kun pitä
      Maailman menoa
      101
      2021
    8. Vain persut vastustivat hiilivoimaloiden alasajoa

      Persut vastusti jyrkästi hiilen kieltolakia ja on myöhemmin vaatinut hiilivoimaloiden pitämistä käytössä. He perusteliva
      Maailman menoa
      42
      1885
    9. Mikä aate kaiken pahan takana?

      Se laiskistuttaa kansat, opettaa vaatimaan etuisuuksia, syleilee maailmoja eikä omaa kansaa.
      Maailman menoa
      107
      1816
    10. Mietin sua liikaa

      Mietin nytkin sitä, että millaista se olisi tulla kotiin, kun sinä olisit täällä vastassa. Tai niin päin, että sinä tuli
      Ikävä
      71
      1189
    Aihe