{"id":127,"date":"2007-12-04T20:44:35","date_gmt":"2007-12-04T18:44:35","guid":{"rendered":"http:\/\/pixy.cz\/pixynergia\/2007\/javascriptovy-problem-pojmenovani-obsahu-pole\/"},"modified":"2007-12-05T11:42:43","modified_gmt":"2007-12-05T09:42:43","slug":"javascriptovy-problem-pojmenovani-obsahu-pole","status":"publish","type":"post","link":"https:\/\/www.pixy.cz\/pixynergia\/2007\/12\/04\/javascriptovy-problem-pojmenovani-obsahu-pole","title":{"rendered":"Javascriptov\u00fd probl\u00e9m: pojmenov\u00e1n\u00ed obsahu pole"},"content":{"rendered":"\n<p>Narazil jsem na docela zaj\u00edmavou ot\u00e1zku v\u00a0Javascriptu a zaj\u00edmalo by m\u011b,\njak takovou v\u011bc co nejelegantn\u011bji vy\u0159e\u0161it. \u0158ekn\u011bme, \u017ee m\u00e1m funkci,\nkter\u00e1 od n\u011bjka\u00e9ho ciz\u00edho extern\u00edho zdroje dost\u00e1v\u00e1 jedin\u00fd parametr,\nkter\u00fd je pole. Po\u0159ad\u00ed a v\u00fdznam jeho polo\u017eek jsou pevn\u011b d\u00e1ny, d\u00e9lka pole\nje prom\u011bnn\u00e1 (nemus\u00ed b\u00fdt uvedeny v\u0161echny definovan\u00e9 polo\u017eky) a podobu a\nzp\u016fsob p\u0159ed\u00e1v\u00e1n\u00ed toho parametru nemohu nijak ovlivnit. Ot\u00e1zka zn\u00ed, jak co\nnejl\u00e9pe na\u010d\u00edst toto pole tak, abych na jeho polo\u017eky nep\u0159istupoval p\u0159es\nindexy, ale p\u0159es n\u011bjak\u00e1 smyslupln\u00e1\u00a0jm\u00e9na.<\/p>\n\n<p>V\u00a0PHP to ud\u011bl\u00e1m snadno:<\/p>\n\n<pre class=\"php\"><code><span class=\"php-keyword2\">list<\/span>(<span\nclass=\"php-var\">$jmeno<\/span>,<span class=\"php-var\">$prijmeni<\/span>,<span\nclass=\"php-var\">$datum<\/span>,...,<span class=\"php-var\">$status<\/span>) = <span\nclass=\"php-var\">$arr<\/span>;<\/code><\/pre>\n\n<p>V\u00a0Javascriptu ale (pokud v\u00edm) podobn\u00fd konstrukt nen\u00ed. \u00dapln\u011b\nnejpitom\u011bj\u0161\u00ed \u0159e\u0161en\u00ed je nasnad\u011b:<\/p>\n\n<pre class=\"js\"><code><span class=\"js-keywords1\">function<\/span><span\nclass=\"js-out\"> X(arr) {\n   <\/span><span class=\"js-keywords1\">var<\/span><span\nclass=\"js-out\"> jmeno = arr[<\/span><span class=\"js-num\">0<\/span><span\nclass=\"js-out\">];\n   <\/span><span class=\"js-keywords1\">var<\/span><span\nclass=\"js-out\"> prijmeni = arr[<\/span><span class=\"js-num\">1<\/span><span\nclass=\"js-out\">];\n   <\/span><span class=\"js-keywords1\">var<\/span><span\nclass=\"js-out\"> datum = arr[<\/span><span class=\"js-num\">2<\/span><span\nclass=\"js-out\">];\n<\/span><span class=\"js-comment\">\/\/ ...\n<\/span><span\nclass=\"js-out\">   <\/span><span class=\"js-keywords1\">var<\/span><span\nclass=\"js-out\"> status = arr[arr.length-<\/span><span\nclass=\"js-num\">1<\/span><span class=\"js-out\">];\n<\/span><span\nclass=\"js-comment\">\/\/ ...\n<\/span><span\nclass=\"js-out\">   alert(prijmeni);\n   }<\/span><\/code><\/pre>\n\n<p>Co\u017e je v\u00e1\u017en\u011b docela hloup\u00e9. Malinko lep\u0161\u00ed (nebo sp\u00ed\u0161 \u010dist\u0161\u00ed) se\njev\u00ed p\u0159i\u0159azen\u00ed do objektu:<\/p>\n\n<pre class=\"js\"><code><span class=\"js-keywords1\">function<\/span><span\nclass=\"js-out\"> X(arr) {\n   <\/span><span class=\"js-keywords1\">var<\/span><span\nclass=\"js-out\"> osoba = {\n      jmeno: arr[<\/span><span\nclass=\"js-num\">0<\/span><span class=\"js-out\">],\n      prijmeni: arr[<\/span><span\nclass=\"js-num\">1<\/span><span class=\"js-out\">],\n      datum: arr[<\/span><span\nclass=\"js-num\">2<\/span><span class=\"js-out\">],\n<\/span><span\nclass=\"js-comment\">\/\/    ...\n<\/span><span\nclass=\"js-out\">      status: arr[arr.length-<\/span><span\nclass=\"js-num\">1<\/span><span class=\"js-out\">]\n      }\n<\/span><span\nclass=\"js-comment\">\/\/ ...\n<\/span><span\nclass=\"js-out\">   alert(osoba.prijmeni);\n   }<\/span><\/code><\/pre>\n\n<p>Taky si m\u016f\u017eu ty n\u00e1zvy p\u0159eddefinovat a p\u0159i\u0159azen\u00ed zautomatizovat:<\/p>\n\n<pre class=\"js\"><code><span class=\"js-keywords1\">function<\/span><span\nclass=\"js-out\"> X(arr) {\n   <\/span><span class=\"js-keywords1\">var<\/span><span\nclass=\"js-out\"> def = [<\/span><span class=\"js-quote\">'jmeno'<\/span><span\nclass=\"js-out\">,<\/span><span class=\"js-quote\">'prijmeni'<\/span><span\nclass=\"js-out\">,<\/span><span class=\"js-quote\">'datum'<\/span><span\nclass=\"js-out\">, ..., <\/span><span class=\"js-quote\">'status'<\/span><span\nclass=\"js-out\">];\n   <\/span><span class=\"js-keywords1\">var<\/span><span\nclass=\"js-out\"> n = def.length;\n   <\/span><span\nclass=\"js-keywords1\">if<\/span><span\nclass=\"js-out\"> (arr.length&lt;n) n = arr.length;\n   <\/span><span\nclass=\"js-keywords1\">var<\/span><span class=\"js-out\"> osoba;\n   <\/span><span\nclass=\"js-keywords1\">for<\/span><span class=\"js-out\"> (<\/span><span\nclass=\"js-keywords1\">var<\/span><span class=\"js-out\"> i=<\/span><span\nclass=\"js-num\">0<\/span><span\nclass=\"js-out\">;i&lt;n;i++) osoba[def[i]] = arr[i];\n<\/span><span\nclass=\"js-comment\">\/\/ ...\n<\/span><span\nclass=\"js-out\">   alert(osoba[<\/span><span\nclass=\"js-quote\">'prijmeni'<\/span><span\nclass=\"js-out\">]);\n   }<\/span><\/code><\/pre>\n\n<p>anebo rovnou jako spr\u00e1vn\u00fd drso\u0148:<\/p>\n\n<pre class=\"js\"><code><span\nclass=\"js-out\">Array.prototype.addKeys = <\/span><span\nclass=\"js-keywords1\">function<\/span><span class=\"js-out\">(def) {\n   <\/span><span\nclass=\"js-keywords1\">var<\/span><span\nclass=\"js-out\"> n = Math.min(def.length, <\/span><span\nclass=\"js-keywords1\">this<\/span><span class=\"js-out\">.length);\n   <\/span><span\nclass=\"js-keywords1\">for<\/span><span class=\"js-out\"> (<\/span><span\nclass=\"js-keywords1\">var<\/span><span class=\"js-out\"> i=<\/span><span\nclass=\"js-num\">0<\/span><span class=\"js-out\">;i&lt;n;i++) <\/span><span\nclass=\"js-keywords1\">this<\/span><span\nclass=\"js-out\">[def[i].toString()] = <\/span><span\nclass=\"js-keywords1\">this<\/span><span class=\"js-out\">[i];\n   }\n<\/span><span\nclass=\"js-keywords1\">function<\/span><span\nclass=\"js-out\"> X(arr) {\n   arr.addKeys([<\/span><span\nclass=\"js-quote\">'jmeno'<\/span><span class=\"js-out\">,<\/span><span\nclass=\"js-quote\">'prijmeni'<\/span><span class=\"js-out\">,<\/span><span\nclass=\"js-quote\">'datum'<\/span><span class=\"js-out\">, ..., <\/span><span\nclass=\"js-quote\">'status'<\/span><span class=\"js-out\">]);\n<\/span><span\nclass=\"js-comment\">\/\/ ...\n<\/span><span\nclass=\"js-out\">   alert(arr.prijmeni);\n   }<\/span><\/code><\/pre>\n\n<p>Ale ur\u010dit\u011b existuje n\u011bjak\u00fd lep\u0161\u00ed, elegantn\u011bj\u0161\u00ed zp\u016fsob, jak si ten\nobsah pole pojmenovat. Napadne n\u011bkoho\u00a0n\u011bco?<\/p>\n\n<hr \/>\n\n<h3>Update: Moc p\u011bkn\u00e9 \u0159e\u0161en\u00ed<\/h3>\n\n<p>Kolega <em>wiki<\/em> p\u0159i\u0161el na pom\u011brn\u011b elegantn\u00ed a podle m\u011b vtipn\u00e9\n\u0159e\u0161en\u00ed: p\u0159edat pole, kter\u00e9 funkce dostane, jako standardn\u00ed parametry\ndruh\u00e9 funkci, kter\u00e1 u\u017e s\u00a0nimi bude pracovat norm\u00e1ln\u011b. Nejl\u00e9pe uk\u00e1zat na\np\u0159\u00edkladu:<\/p>\n\n<pre class=\"js\"><code><span class=\"js-keywords1\">function<\/span><span\nclass=\"js-out\"> X(arr) {\n   X2.apply(<\/span><span\nclass=\"js-keywords1\">null<\/span><span class=\"js-out\">,arr);\n   }\n<\/span><span\nclass=\"js-keywords1\">function<\/span><span\nclass=\"js-out\"> X2(jmeno,prijmeni,datum,...,status) {\n<\/span><span\nclass=\"js-comment\">\/\/ ...\n<\/span><span\nclass=\"js-out\">   alert(prijmeni);\n   }<\/span><\/code><\/pre>\n\n<p>Podle pot\u0159eby bych si to mohl upravit do n\u011bjak\u00fdch sofistikovan\u011bj\u0161\u00edch\ntvar\u016f, ale princip z\u016fst\u00e1v\u00e1. Ve fin\u00e1le by to mohlo vypadat nap\u0159\u00edklad\ntakhle:<\/p>\n\n<pre class=\"js\"><code><span class=\"js-keywords1\">function<\/span><span\nclass=\"js-out\"> X(arr) {\n   (<\/span><span\nclass=\"js-keywords1\">function<\/span><span\nclass=\"js-out\"> (jmeno,prijmeni,datum,...,status) {\n<\/span><span\nclass=\"js-comment\">\/\/    ...\n<\/span><span\nclass=\"js-out\">      alert(prijmeni);\n      }).apply(<\/span><span\nclass=\"js-keywords1\">null<\/span><span\nclass=\"js-out\">,arr);\n   }<\/span><\/code><\/pre>\n\n<p>M\u00e1 to jen malou mu\u0161ku v\u00a0tom, \u017ee to funguje a\u017e v\u00a0Javascriptu\u00a01.3, resp.\nJScriptu\u00a05.5, tedy od IE\u00a05.5 (v\u00a05.0\u00d7 to chodit nebude), ale to u\u017e by dnes\nnem\u011blo skoro nikoho tr\u00e1pit. D\u00edky moc za supr\u00a0n\u00e1pad.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Narazil jsem na docela zaj\u00edmavou ot\u00e1zku v\u00a0Javascriptu a zaj\u00edmalo by m\u011b, jak takovou v\u011bc co nejelegantn\u011bji vy\u0159e\u0161it. \u0158ekn\u011bme, \u017ee m\u00e1m funkci, kter\u00e1 od n\u011bjka\u00e9ho ciz\u00edho extern\u00edho zdroje dost\u00e1v\u00e1 jedin\u00fd parametr, kter\u00fd je pole. Po\u0159ad\u00ed a v\u00fdznam jeho polo\u017eek jsou pevn\u011b d\u00e1ny, d\u00e9lka pole je prom\u011bnn\u00e1 (nemus\u00ed b\u00fdt uvedeny v\u0161echny definovan\u00e9 polo\u017eky) a podobu a zp\u016fsob &hellip; <a href=\"https:\/\/www.pixy.cz\/pixynergia\/2007\/12\/04\/javascriptovy-problem-pojmenovani-obsahu-pole\" class=\"more-link\">Pokra\u010dov\u00e1n\u00ed textu <span class=\"screen-reader-text\">Javascriptov\u00fd probl\u00e9m: pojmenov\u00e1n\u00ed obsahu pole<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,1,4],"tags":[],"class_list":["post-127","post","type-post","status-publish","format-standard","hentry","category-it","category-vseobecne","category-webdesign"],"_links":{"self":[{"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/posts\/127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/comments?post=127"}],"version-history":[{"count":0,"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/posts\/127\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/media?parent=127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/categories?post=127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pixy.cz\/pixynergia\/wp-json\/wp\/v2\/tags?post=127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}