Autor Zpráva
hypot
Profil
Zdravím, občas bych potřeboval poradit s nějakými úseky v různých ukázkových skriptech, které nechápu. Hned bych začal následujícím skriptem, který má ze zadaného pole čísel odstranit duplicity (např. z [1,1,2,3,3,4,5,5] vrací [1,2,3,4,5]):
function clean(a1) {  
      var i,  
      result = [],  
      obj = {};   
      for (i=0; i<a1.length; i++)  
      {  
      obj[a1[i]]=0;  
      };
      for (i in obj) {  
      result.push(i);  
      };
      return result;  
      }
Vůbec nechápu, co má dělat kód na sedmém řádku (obj[a1[i]]=0) ani jeho syntaxi (hranaté závorky za objektem?). Zkoušel jsem měnit číslo za rovnítkem v naději, že bych z výsledného chování skriptu toto nějak pochopil, ale zjistil jsem jen, že je zcela jedno, jaké číslo za rovnítkem je, dokonce že místo konkrétního čísla může být i Number. Předem děkuji za vysvětlení.
Alphard
Profil
Ono to je fakt jedno, ta hodnota, o kterou vám jde, se ukládá jako klíč (vlastnost) do nového objektu obj. Vlastně ten objekt slouží jen jako slovník. Opakované přiřazení tytéž hodnoty nemá žádný efekt, tím se odstraní duplicity.
Radek9
Profil
hypot:
Pro práci bez duplicitních dat je lepší využít strukturu k tomu určenou: Set
Chamurappi
Profil
Reaguji na Radka9:
Která má ale slabší podporu mezi prohlížeči, takže bych jí nedoporučoval.
Radek9
Profil
Chamurappi:
Je tu možnost použít polyfill. Což mi přijde i jednodušší, než si psát vlastní funkci.
hypot
Profil
Mně nejde o to najít nějaký vhodný kód, který by odstranil duplicity z pole, na to jsem se neptal. Rovněž jsem si citovaný skript nepsal sám, to bych si do něj logicky nevkládal něco, čemu nerozumím. Zkrátka jsem v nějakém skriptu - a je jedno, co má být jeho účelem - našel něco, co nechápu, a chtěl bych to vysvětlit.
K první odpovědi: Už to začínám trochu chápat. Nemám úplně v malíku syntaxi, takže jsem si neuvědomil, že vlastnost objektu se k jeho jménu nepřipojuje jen tečkou, ale i hranatými závorkami. Ale neměla by být správně vlastnost v závorkách uvozena uvozovkami, tj. objekt["vlastnost"]? Přinejmenším už je mi tedy jasné, co dělá cyklus na řádku 5 (vkládá hodnoty ze zadaného pole do objektu obj jako jeho vlastnosti), ale pořád si nedovedu představit, jak by výsledný objekt měl vypadat. Jestliže objekt je řada dvojic vlastnost:hodnota, jak tedy bude vypadat objekt obj po dokončení cyklu z řádku 5?
Radek9
Profil
hypot:
Ale neměla by být správně vlastnost v závorkách uvozena uvozovkami, tj. objekt["vlastnost"]?
No, v uvozovkách je to proto, že je to string. Jednoduše řečeno, do těch hranatých závorek můžeš dát cokoli, co je string, nebo se může na string přetypovat. (Případně to ještě může být Symbol, ale to je taky věc se slabou podporou.) Pokud např. přistupuješ k prvku pole (nějak takhle: pole[0]), tak tam reálně nepřistupuješ pomocí toho čísla, ale pomocí stringu "0". Tudíž když do hranatých závorek dáš proměnnou, použije se jako klíč její hodnota. V tomto případě prvky pole [1,1,2,3,3,4,5,5], potažmo ona čísla přetypovaná na stringy. Taky si všimni, že to pole, co ti vrací ta tvoje funkce, obsahuje stringy, nikoli čísla.

jak tedy bude vypadat objekt obj po dokončení cyklu z řádku 5?
Bude vypadat přesně takto:
{
  "1": 0,
  "2": 0,
  "3": 0
}
ServIT
Profil
Asi nejlepší na průzkum javascriptu je použít firefox s doplňkem firebug .. umí krokovat javascript a zkoumat proměnné i pole i objekty stránky ..

7.mý rádek pouze pomocí cyklu inicialuzuje prvky pole (asociativního pole, slovníku ... říká se tomu všelijak, prostě klíč=> hodnota ). Ale to asi budeš znát
Radek9
Profil
ServIT:
inicialuzuje prvky pole (asociativního pole, slovníku ... říká se tomu všelijak, prostě klíč=> hodnota )
To je v rámci JS trochu scestná definice. Je to prachsprostý objekt, pole je něco jiného. A jistě, objekt se dá používat jako slovník a často se to i dělá, ale v mnoha případech je mnohem výhodnější použít Map nebo WeakMap (např. právě kvůli zachování datového typu klíče).
hypot
Profil
Tak konečně tomu celému rozumím. Skript stojí na tom, jak se chová smyčka for ... in v případě, že jsou v objektu duplicitní vlastnosti, což je ovšem něco, o čem se ve výukových materiálech nepíše :-(.
Jen bych dodal, že podle mě se v tomto skriptu po proběhnutí první smyčky nevytvoří objekt s podobou {"1":0, "2":0, "3":0, "4":0, "5":0}, nýbrž {"1":0, "1":0, "2":0, "3":0, "3":0, "4":0, "5":0, "5":0} a až teprve smyčka for ... in bude duplicity ignorovat. Zkusil jsem vytvořit pokusný objekt {"jméno": "Petr", "jméno": "David", "jméno": "Jakub", "příjmení": "Novotný", "věk": 41} a při použití této smyčky se mi vypsaly jen tři vlastnosti: jméno,příjmení,věk a potom tyto tři jejich hodnoty: Jakub,Novotný,41.
_es
Profil
hypot:
podle mě se v tomto skriptu po proběhnutí první smyčky nevytvoří objekt s podobou {"1":0, "2":0, "3":0, "4":0, "5":0}, nýbrž {"1":0, "1":0, "2":0, "3":0, "3":0, "4":0, "5":0, "5":0}
Tak to nie je, aký by to malo zmysel? Ako by sa potom dalo dostať k obom hodnotám vlastnosti "1"? Pri zápise vlastnosti objektu sa postupuje tak, že ak vlastnosť s takým názvom neexistuje, tak sa vytvorí a zapíše sa jej hodnota. ak taká vlastnosť existuje, tak sa len prepíše jej hodnota.
Radek9
Profil
hypot:
Teď jsem si všiml, že objektu popsanému v [#7] chybí prvky "4" a "5", to mi nějak vypadlo.

Skript stojí na tom, jak se chová smyčka for ... in v případě, že jsou v objektu duplicitní vlastnosti, což je ovšem něco, o čem se ve výukových materiálech nepíše
Jak píše _es, žádné duplicitní vlastnosti tam nejsou. To by bylo krajně neefektivní z pohledu paměti i vyhledávání posledního přidaného prvku s daným klíčem. Pokud tam už např. prvek s klíčem "1" je, tak se jednoduše přepíše. Abych to ukázal konkrétně: Při iteraci onoho pole [1,1,2,3,3,4,5,5] objekt obj posupně vypadá takhle:
i = 0, a1[i] = 1 : { "1": 0 }
i = 1, a1[i] = 1 : { "1": 0 }
i = 2, a1[i] = 2 : { "1": 0, "2": 0 }
i = 3, a1[i] = 3 : { "1": 0, "2": 0, "3": 0 }
i = 4, a1[i] = 3 : { "1": 0, "2": 0, "3": 0 }
i = 5, a1[i] = 4 : { "1": 0, "2": 0, "3": 0, "4": 0 }
i = 6, a1[i] = 5 : { "1": 0, "2": 0, "3": 0, "4": 0, "5": 0 }
i = 7, a1[i] = 5 : { "1": 0, "2": 0, "3": 0, "4": 0, "5": 0 }
hypot
Profil
Mám dotaz na další skipt, jemuž nerozumím. Jeho úkolem je převést arabské číslice na římské:
function ar-rom(num) {
var digits = String(+num).split(""),
key = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
"","I","II","III","IV","V","VI","VII","VIII","IX"],
roman_num = "",
i = 3;
while (i--)
roman_num = (key[+digits.pop() + (i * 10)] || "") + roman_num;
return Array(+digits.join("") + 1).join("M") + roman_num;
}
Hlavně nerozumím devátému a desátému řádku, nedokážu si představit, co se tam děje, je to pro mě napsané nesrozumitelně (třeba jaký je účel ||""?). Také nechápu účel proměnné i a proč má hodnotu 3.
Mohl by mi někdo tento skript vysvětlit? Díky.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0