我正在尝试学习一些新鲜的javascript技术,并在我的任务中这样做,这里是我模拟的一个函数:
function doAction(index) {
for(var a = Array.prototype.slice.call(arguments, 1),
i = 0, r = [], l = a.length; i < l; i++)
r.push(a[i][index]);
return r;
}
doAction(2, ['a','b','c'],['a','b','c'],['a','b','c']) //==> ["c", "c", "c"]
这基本上就是它所做的:从一系列数组中获取每个第n个元素,并将它们返回到一个新数组中。
我想用奇怪的忍者风格的想法来改进这个函数,不一定要缩短代码,而是优化它。(你很可能已经注意到臭名昭著的Array.prototype.slice
);
由于英语不是我的母语,我也想为这个函数执行的动作取一个合适的名字。提前感谢男士们(和女士们!)
哦,这是小提琴:http://jsfiddle.net/Exv7Z/
编辑:谈论优化的事情…(来自评论中的天才的想法)function doAction(index) {
return Array.prototype.slice.call(arguments, 1).map(function(b) {
return b[index];
});
}
我认为没有太多要优化的,但我会做两个更改
- 首先,声明一个真正的参数,而不是使用一些不在这里的参数 第二,我把变量初始化放在for之外。
这两点并不是真正的优化,而是可读性(也许是品味)的问题
代码类似于
function doAction(index,a) {
var r = [], l = a.length;
for(var i=0; i < l; i++) r.push(a[i][index]);
return r;
}
,调用将是doAction(2, [['a','b','c'],['a','b','c'],['a','b','c']]);
可以这样简化,因为不需要复制参数数组。它只需要复制它需要修改:
function doAction(index) {
var r = [];
for(var i = 1; i < arguments.length; i++) r.push(arguments[i][index]);
return r;
}
或者如果你想保留len变量,它可以是:
function doAction(index) {
var r = [];
for(var i = 1, len = arguments.length; i < len; i++) r.push(arguments[i][index]);
return r;
}
jsFiddle here: http://jsfiddle.net/jfriend00/Z22w7/.
至于名称,您可以称之为multiSlice()
或multiIndex()
。