Narazil jsem na docela zajímavou otázku v Javascriptu a zajímalo by mě,
jak takovou věc co nejelegantněji vyřešit. Řekněme, že mám funkci,
která od nějkaého cizího externího zdroje dostává jediný parametr,
který je pole. Pořadí a význam jeho položek jsou pevně dány, délka pole
je proměnná (nemusí být uvedeny všechny definované položky) a podobu a
způsob předávání toho parametru nemohu nijak ovlivnit. Otázka zní, jak co
nejlépe načíst toto pole tak, abych na jeho položky nepřistupoval přes
indexy, ale přes nějaká smysluplná jména.
V PHP to udělám snadno:
list($jmeno,$prijmeni,$datum,...,$status) = $arr;
V Javascriptu ale (pokud vím) podobný konstrukt není. Úplně
nejpitomější řešení je nasnadě:
function X(arr) {
var jmeno = arr[0];
var prijmeni = arr[1];
var datum = arr[2];
var status = arr[arr.length-1];
alert(prijmeni);
}
Což je vážně docela hloupé. Malinko lepší (nebo spíš čistší) se
jeví přiřazení do objektu:
function X(arr) {
var osoba = {
jmeno: arr[0],
prijmeni: arr[1],
datum: arr[2],
status: arr[arr.length-1]
}
alert(osoba.prijmeni);
}
Taky si můžu ty názvy předdefinovat a přiřazení zautomatizovat:
function X(arr) {
var def = ['jmeno','prijmeni','datum', ..., 'status'];
var n = def.length;
if (arr.length<n) n = arr.length;
var osoba;
for (var i=0;i<n;i++) osoba[def[i]] = arr[i];
alert(osoba['prijmeni']);
}
anebo rovnou jako správný drsoň:
Array.prototype.addKeys = function(def) {
var n = Math.min(def.length, this.length);
for (var i=0;i<n;i++) this[def[i].toString()] = this[i];
}
function X(arr) {
arr.addKeys(['jmeno','prijmeni','datum', ..., 'status']);
alert(arr.prijmeni);
}
Ale určitě existuje nějaký lepší, elegantnější způsob, jak si ten
obsah pole pojmenovat. Napadne někoho něco?
Update: Moc pěkné řešení
Kolega wiki přišel na poměrně elegantní a podle mě vtipné
řešení: předat pole, které funkce dostane, jako standardní parametry
druhé funkci, která už s nimi bude pracovat normálně. Nejlépe ukázat na
příkladu:
function X(arr) {
X2.apply(null,arr);
}
function X2(jmeno,prijmeni,datum,...,status) {
alert(prijmeni);
}
Podle potřeby bych si to mohl upravit do nějakých sofistikovanějších
tvarů, ale princip zůstává. Ve finále by to mohlo vypadat například
takhle:
function X(arr) {
(function (jmeno,prijmeni,datum,...,status) {
alert(prijmeni);
}).apply(null,arr);
}
Má to jen malou mušku v tom, že to funguje až v Javascriptu 1.3, resp.
JScriptu 5.5, tedy od IE 5.5 (v 5.0× to chodit nebude), ale to už by dnes
nemělo skoro nikoho trápit. Díky moc za supr nápad.