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ä ?
JavaScript ja MyArray.sort() ei onnistu
10
237
Vastaukset
- 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/rc37CK9eJoo, 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/rc37CK9eToisaalta, 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
Metsäkoneen kuljettaja huuteli tutkijalle
"voisit kyllä ottaa rintaliivit pois ennen kuin tulet minulle juttelemaan, hän sanoo." https://yle.fi/a/74-20106446 On7049910Suomi on täysin sekaisin
Jo ties monettako päivää hirveä itku ja poru jostain helvetin nilviäisistä. https://www.is.fi/taloussanomat/art-20000104044321Kaikki ei vieläkään usko luontokatoon.
Suomussalmen Hukkajoella foliohattu metsäkoneen kuljettaja tuhosi tuhansia harvinaisia jokihelmisimpukoita eli raakkuja902976Sano vain suoraan, että nyt riittää
ettei kiinnosta. Sano, että lopeta! En ihmettelisi, jos olet saanut tarpeeksesi ja toivot minun ymmärtävän lopettaa. Eh432855Mari Rantanen asettaa sairaan lapsen edun oman uransa edelle - (tekikö Marin samaa)
Noin toimii kunnon vastuuntuntoinen äiti, mutta siitäkin nämä mt-ongelmaiset vasemmistolaiset häntä täällä haukkuvat. "2292654Ohhoh! Ex-pääministeri Sanna Marinin Joni-rakas paljasti ilouutisen: "Tässä kuussa..."
Sanna Marin on ollut naimisissa Markus Räikkösen kanssa. Nyt hänen seurassaan on usein julkkishiusmuotoilija Joni Willb552644- 1531835
Luokatonta toimintaa
Tyrmistyttävää toimintaa Stora Enson korjuu yrittäjältä Hukkajoella. Täyttä piittaamattomuutta laeista ja luontoarvoista701691Ensimmäisestä kohtaamisesta saakka
minulla on ollut hämmentynyt olo. Miten voit tuntua siltä, että olisin tuntenut sinut aina? Sinun kanssasi on yhtä aikaa141620Maailmankuulu homopingviini on kuollut
Minä niin toivoin että pariskunta olisi saatu kunniavieraiksi ensi kesän Prideen. 💔 "Maailmankuulu homopingviini on k61423