J'ai récemment essayé d'utiliser une implémentation de map en javascript pour créer un tas d'éléments, puis les appliquer à une méthode d'ajout d'objet.Implémenter une carte en javascript qui supporte les méthodes objet comme des fonctions mappées?
Premièrement avec une implémentation standard de la carte.
var map = function (fn, a)
{
for (i = 0; i < a.length; i++)
{
a[i] = fn(a[i]);
}
}
Configuration.
var translateMenu = new Menu;
var languages = [ ['Chinese' , 'zh-CN']
, ['German' , 'de']
, ['French' , 'fr']
, ['Portugese' , 'pt']
, ['Hindi' , 'hi']
];
Et ma fonction ... (pas anonyme, comme il est utilisé plus tard lors de l'ajout du translateMenu à mainMenu.)
var langItem = function (language, subMenu)
{
return new MenuItem(language[0], 'http://translate.google.com/translate?u=www.example.com&hl=en&ie=UTF-8&tl=en&sl=' + language[1] , "" , subMenu);
}
map (langItem , languages);
Tout cela a bien fonctionné, j'avais maintenant un tableau de MenuItems jeter autour. Si vous essayez d'appeler map(Menu.add , languages)
, les variables internes de Menu ne seront pas définies et l'appel échouera.
Maintenant, je suis certain que cela a à voir avec la portée de la méthode Menu.add()
, donc je pensais que si je passais dans l'objet aussi, cela pourrait fonctionner.
J'ai essayé de créer une nouvelle fonction de carte qui accepterait des objets et des fonctions, mais avec la même erreur non définie.
objMap (fn , obj , a) {
for (i = 0; i < a.length; i++)
{
obj.fn(a);
}
}
objMap (add , translateMenu , languages); // failed
J'ai travaillé autour de ce en étendant Menu avec addAll() pour prendre un tableau, qui fonctionne très bien ...
Menu.prototype.addAll = function (items){
for (i = 0; i < items.length; i++)
{
this.add(items[i]);
}
}
translateMenu.addAll(languages); // yay! but I want a more elegant solution.
Quoi qu'il en soit, ma question est, comment pourrais-je mettre en œuvre la carte (ou une fonction générique similaire) pour prendre réellement en charge l'utilisation de méthodes objet comme fonctions mappées?.
Merci, c'est une excellente réponse. :RÉ – garrow