寻找javascript技术



我正在尝试学习一些新鲜的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()

最新更新