我最近尝试在 javascript 中使用 map 的实现来创建一堆项目,然后将它们应用于对象添加方法。
首先是地图的沼泽标准实现。
var map = function (fn, a)
{
for (i = 0; i < a.length; i++)
{
a[i] = fn(a[i]);
}
}
设置。
var translateMenu = new Menu;
var languages = [ ['Chinese' , 'zh-CN']
, ['German' , 'de']
, ['French' , 'fr']
, ['Portugese' , 'pt']
, ['Hindi' , 'hi']
];
还有我的函数......(不是匿名的,因为它后来在将 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 );
这一切都很好,我现在有一组 MenuItems 可以扔掉。
尝试调用map( Menu.add , languages )
会导致 Menu 的内部变量未定义,并且调用失败。
现在我确定这与Menu.add()
方法的范围有关,所以我想如果我也传入对象,它可能会起作用。
我尝试创建一个可以接受对象和函数的新地图函数,但有相同的未定义错误。
objMap (fn , obj , a) {
for (i = 0; i < a.length; i++)
{
obj.fn(a);
}
}
objMap ( add , translateMenu , languages ); // failed
我通过使用 addAll() 扩展 Menu 来解决这个问题,以获取一个数组,效果很好......
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.
无论如何,我的问题是,我如何实现 map (或类似的通用函数)以实际支持使用对象方法作为我的映射函数?.