python reduce函数未定义_与Python的zip函数等价的Javascript

本文介绍了如何在JavaScript中创建一个与Python的zip函数功能类似的实现,包括不同版本的实现方式,处理数组长度不一致的情况,以及模拟Python的zip_longest行为。还讨论了如何处理可迭代对象和反转zip函数的方法。
摘要由CSDN通过智能技术生成

2016更新:

下面是一个时髦的Ecmascript 6版本:zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c]))

相当于Python的插图:> zip([['row0col0', 'row0col1', 'row0col2'],

['row1col0', 'row1col1', 'row1col2']]);

[["row0col0","row1col0"],

["row0col1","row1col1"],

["row0col2","row1col2"]]

(FizzyTea指出ES6有可变的参数语法,所以下面的函数定义将像python一样,但是请参见下面的免责声明。。。这不是它自己的逆命题,因此zip(zip(x))将不等于x;尽管正如Matt Kramer指出的zip(...zip(...x))==x(就像在普通python中一样zip(*zip(*x))==x)

另一种定义,相当于Python{zip:> zip = (...rows) => [...rows[0]].map((_,c) => rows.map(row => row[c]))

> zip( ['row0col0', 'row0col1', 'row0col2'] ,

['row1col0', 'row1col1', 'row1col2'] );

// note zip(row0,row1), not zip(matrix)

same answer as above

(请注意,...语法此时可能会有性能问题,将来也可能会有性能问题,因此如果将第二个答案与可变参数一起使用,则可能需要对其进行性能测试。)

这是一条单行线: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(...)

上面的假设是数组的大小应该是相等的。它还假设您传入一个列表参数列表,这与Python版本中参数列表是可变的不同。如果您想要所有这些功能,请参见下文。只需要额外的两行代码。

下面将模拟Python在数组大小不相等的边缘情况下的zip行为,静默地假装数组的较长部分不存在:function zip() {

var args = [].slice.call(arguments);

var shortest = args.length==0 ? [] : args.reduce(function(a,b){

return a.length

});

return shortest.map(function(_,i){

return args.map(function(array){return array[i]})

});

}

// > zip([1,2],[11,22],[111,222,333])

// [[1,11,111],[2,22,222]]]

// > zip()

// []

这将模拟Python的itertools.zip_longest行为,在未定义数组的地方插入undefined:function zip() {

var args = [].slice.call(arguments);

var longest = args.reduce(function(a,b){

return a.length>b.length ? a : b

}, []);

return longest.map(function(_,i){

return args.map(function(array){return array[i]})

});

}

// > zip([1,2],[11,22],[111,222,333])

// [[1,11,111],[2,22,222],[null,null,333]]

// > zip()

// []

如果你使用最后两个版本(variadic aka。多个参数版本),那么zip就不再是它自己的逆了。要模拟Python中的zip(*[...])习惯用法,当您想要反转zip函数或类似地希望将可变数量的列表作为输入时,您需要执行zip.apply(this, [...])。

附录:

要使此句柄成为任何可iterable(例如,在Python中,可以对字符串、范围、映射对象等使用zip),可以定义以下内容:function iterView(iterable) {

// returns an array equivalent to the iterable

}

但是,如果您在下面的way中编写zip,即使这样也没有必要:function zip(arrays) {

return Array.apply(null,Array(arrays[0].length)).map(function(_,i){

return arrays.map(function(array){return array[i]})

});

}

演示:> JSON.stringify( zip(['abcde',[1,2,3,4,5]]) )

[["a",1],["b",2],["c",3],["d",4],["e",5]]

(或者,如果您已经编写了Python风格的函数,则可以使用该函数。最终,您将能够使用ECMAScript数组理解或生成器。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值