{"id":783,"date":"2017-11-20T13:54:40","date_gmt":"2017-11-20T12:54:40","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/ordinamento-in-javascript-array-sort\/"},"modified":"2017-11-20T13:54:40","modified_gmt":"2017-11-20T12:54:40","slug":"ordinamento-in-javascript-array-sort","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/ordinamento-in-javascript-array-sort\/","title":{"rendered":"Di cosa parlo quando parlo di ordinamento: districare Array#sort"},"content":{"rendered":"<p>La classificazione delle cose \u00e8 una parte fondamentale della nostra vita quotidiana: \u00e8 qualcosa che facciamo ogni giorno per rendere pi\u00f9 facile la nostra vita, seguendo ogni tipo di criterio. Che stiate cercando il numero di telefono di una persona, la posizione del vostro libro preferito, o addirittura di <a href=\"http:\/\/www.bbc.com\/news\/magazine-37196037\"> abbinare i vostri calzini <\/a>, l&#8217;ordinamento ci permette di trovare quello che cerchiamo in un modo pi\u00f9 veloce ed efficace.<\/p>\n<p>Lo stesso succede nel mondo dello sviluppo web. Ma se pensate di sapere esattamente come funziona Array#sort di JavaScript sotto il cofano, pensaci due volte.<\/p>\n<div class=\"paragrafo\">\n<h2 id=\"section1\">Esaminare superficialmente<\/h2>\n<p>Indipendentemente dal vostro livello di abilit\u00e0, se siete JavaScript developer, ad un certo punto avrete probabilmente incontrato il metodo Array#sort. Vi ricordate la prima volta che avete provato a riordinare i numeri in JavaScript? Probabilmente sarete rimasti sorpresi dallo scoprire (proprio come tutti noi) che il metodo sort NON riordina le cose esattamente come ci aspetteremmo. Non sapete di cosa sto parlando? Tuffiamoci in un po&#8217; codice:<\/p>\n<pre id=\"snippet1\" class=\" language-javascript\"><code class=\" language-javascript\">const myArray <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token number\">33<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">98<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">25<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span>\nmyArray<span class=\"token punctuation\">.<\/span>sort<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token comment\" spellcheck=\"true\">\/\/ [ 2, 25, 33, 4, 98 ]<\/span><\/code><\/pre>\n<p>Aspetta, cosa?? JavaScript \u00e8 impazzito? In che mondo 25 e 33 sono pi\u00f9 piccoli di 4? Prima di cominciare a ripensare a tutta la nostra vita, vediamo di capirci qualcosa.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section2\">Ordinamento lessicografico<\/h2>\n<p>Ci\u00f2 che sta realmente accadendo \u00e8 che JavaScript sta riordinano il nostro array numerico in maniera lessicografica: pensate all&#8217;ordine alfabetico, dove ogni valore viene trattato come una stringa.<\/p>\n<p>L&#8217;inghippo qui \u00e8 che Array#sort pu\u00f2 ricevere una funzione di confronto come parametro, ma se non gliela si d\u00e0, \u201c<em>gli elementi vengono riordinati convertendoli in stringhe e confrontando le stringhe nell&#8217;ordine dell&#8217;Unicode code point<\/em>\u201d (secondo gli <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/sort\">MDN docs<\/a>). Questo significa che JavaScript tratter\u00e0 il seguente array in maniera simile quando chiamer\u00e0 il metodo sort:<\/p>\n<pre id=\"snippet2\" class=\" language-javascript\"><code class=\" language-javascript\">const numbers <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token number\">80<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">9<\/span><span class=\"token punctuation\">]<\/span>\nnumbers<span class=\"token punctuation\">.<\/span>sort<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token comment\" spellcheck=\"true\">\/\/ [80, 9]\n<\/span>\nconst strings <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">'80'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'9'<\/span><span class=\"token punctuation\">]<\/span>\nstrings<span class=\"token punctuation\">.<\/span>sort<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token comment\" spellcheck=\"true\">\/\/ ['80', '9']<\/span><\/code><\/pre>\n<p>In questo caso, \u201c80\u201d viene prima di \u201c9\u201d perch\u00e9 ha uno Unicode code point pi\u00f9 piccolo. Se non mi credete, date un&#8217;occhiata al valore del code point del primo carattere di ciascuno di questi:<\/p>\n<pre id=\"snippet3\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token string\">\"8\"<\/span><span class=\"token punctuation\">.<\/span>codePointAt<span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\" spellcheck=\"true\">\/\/ 56\n<\/span><span class=\"token string\">\"9\"<\/span><span class=\"token punctuation\">.<\/span>codePointAt<span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\" spellcheck=\"true\">\/\/ 57<\/span><\/code><\/pre>\n<p>Praticamente, la funzione <code>codePointAt()<\/code> \u00e8 semplicemente un <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/String\/codePointAt\">metodo<\/a> dell&#8217;oggetto String che viene usato per ottenere il valore dello Unicode code point di ciascun carattere a un dato indice.<\/p>\n<p>A questo punto, il seguente codice non dovrebbe stupire nessuno perch\u00e9 adesso sappiamo che JavaScript sta semplicemente convertendo in stringhe tutti gli elementi in quegli array e sta confrontando i loro valori Unicode. (S\u00ec, anche le <a href=\"https:\/\/meowni.ca\/posts\/emoji-emoji-emoji\/\">Emojis<\/a> hanno dei valori di Unicode code point).<\/p>\n<pre id=\"snippet4\" class=\" language-javascript\"><code class=\" language-javascript\">const emojis <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Array#sort di Javascript pu\u00f2 diventare un potente strumento nella vostra cassetta degli attrezzi, ma senza una pianificazione appropriata e una conoscenza pi\u00f9 approfondita dei suoi punti di forza e di debolezza pu\u00f2 anche ingannarvi. Claudia Hern\u00e1ndez esplora il funzionamento del sorting in vari engine, in che modo creare funzioni di sorting personalizzare e ci aiuta a migliorare le nostre abilit\u00e0 di ordinamento.<\/p>\n","protected":false},"author":818,"featured_media":7000826,"comment_status":"open","ping_status":"open","template":"","categories":[271,199],"tags":[],"coauthors":[517],"class_list":["post-783","article","type-article","status-publish","has-post-thumbnail","hentry","category-javascript","category-numero-221-1-ottobre-2017"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/783","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=783"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000826"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=783"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=783"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=783"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}