寻找JavaScript技术

时间:2011-09-01 18:35:18

标签: javascript

我正在尝试学习一些新的和hacky 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];
    });
}

2 个答案:

答案 0 :(得分:1)

我认为没有太多优化,但我会做两次改变

  • 首先,声明一个真实的论点,而不是使用一些不在这里的
  • 其次,我将变量初始化放在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']]);

答案 1 :(得分:1)

可以像这样简化,因为不需要复制arguments数组。它只需要复制它需要修改:

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这里:http://jsfiddle.net/jfriend00/Z22w7/

至于名称,您可以将其称为multiSlice()multiIndex()