function zip(arrays) {
return arrays[0].map(function(_,i){
return arrays.map(function(array){return array[i]})
});
}
// > zip([[1,2],[11,22],[111,222]])
// [[1,11,111],[2,22,222]]]
// If you believe the following is a valid return value:
// > zip([])
// []
// then you can special-case it, or just do
// return arrays.length==0 ? [] : arrays[0].map(...)
Underscore provides over 100 functions that support both your favorite workaday functional helpers: map, filter, invoke — as well as more specialized goodies: function binding, javascript templating, creating quick indexes, deep equality testing, and so on.
2016更新:
下面是一个时髦的Ecmascript 6版本:
相当于Python的插图:
(FizzyTea指出ES6有可变的参数语法,所以下面的函数定义将像python一样,但是请参见下面的免责声明。。。这不是它自己的逆命题,因此
zip(zip(x))
将不等于x
;尽管正如Matt Kramer指出的zip(...zip(...x))==x
(就像在普通python中一样zip(*zip(*x))==x
)另一种定义,相当于Python{
zip
:(请注意,
...
语法此时可能会有性能问题,将来也可能会有性能问题,因此如果将第二个答案与可变参数一起使用,则可能需要对其进行性能测试。)这是一条单行线:
上面的假设是数组的大小应该是相等的。它还假设您传入一个列表参数列表,这与Python版本中参数列表是可变的不同。如果您想要所有这些功能,请参见下文。只需要额外的两行代码。
下面将模拟Python在数组大小不相等的边缘情况下的
zip
行为,静默地假装数组的较长部分不存在:这将模拟Python的
itertools.zip_longest
行为,在未定义数组的地方插入undefined
:如果你使用最后两个版本(variadic aka。多个参数版本),那么zip就不再是它自己的逆了。要模拟Python中的
zip(*[...])
习惯用法,当您想要反转zip函数或类似地希望将可变数量的列表作为输入时,您需要执行zip.apply(this, [...])
。附录:
要使此句柄成为任何可iterable(例如,在Python中,可以对字符串、范围、映射对象等使用
zip
),可以定义以下内容:但是,如果您在下面的way中编写
zip
,即使这样也没有必要:演示:
(或者,如果您已经编写了Python风格的函数,则可以使用该函数。最终,您将能够使用ECMAScript数组理解或生成器。)
查看库Underscore。
–说是谁创造了它
我最近开始专门为^{} 函数使用它,它给我留下了很好的第一印象。我正在使用jQuery和CoffeeScript,而且它与它们非常匹配。下划线就在它们离开的地方出现,到目前为止它还没有让我失望。哦,顺便说一下,它只缩小了3kb。
看看吧。
除了ninjagecko出色而全面的回答之外,将两个JS数组压缩成一个“元组模拟”只需要:
说明:
由于Javascript没有
tuples
类型,因此元组、列表和集合的函数在语言规范中不是高优先级的。否则,可以通过Array map in JS >1.6直接访问类似的行为。(
map
实际上,在许多>;JS 1.4引擎中,尽管没有指定,JS引擎制造商通常都会实现它) 与Python的zip
,izip
,。。。结果来自map
的函数样式,因为map
需要一个函数参数。此外,它是Array
-实例的函数。如果输入的额外声明有问题,则可以使用Array.prototype.map
。示例:
结果:
相关性能:
在
for
循环上使用map
-循环:见:What is the most efficient way of merging [1,2] and [7,8] into [[1,7], [2,8]]
注意:基类型(如
false
和undefined
)不具有原型对象层次结构,因此不公开toString
函数。因此,这些在输出中显示为空。由于
parseInt
的第二个参数是基数/数字基数,要将数字转换为基数,并且由于map
将索引作为第二个参数传递给其参数函数,因此使用包装函数。相关问题 更多 >
编程相关推荐