我正在尝试学习一些新的和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];
});
}
答案 0 :(得分:1)
我认为没有太多优化,但我会做两次改变
这两点并不是真正的优化,而是可读性问题(也许是品味)
代码就像
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()
。