Javascript equivalent of Python's zip function

前端 未结 18 1660
天命终不由人
天命终不由人 2020-11-21 07:40

Is there a javascript equivalent of Python\'s zip function? That is, given multiple arrays of equal lengths create an array of pairs.

For instance, if I have three

18条回答
  •  忘了有多久
    2020-11-21 07:46

    In addition to ninjagecko's excellent and comprehensive answer, all it takes to zip two JS-arrays into a "tuple-mimic" is:

    //Arrays: aIn, aOut
    Array.prototype.map.call( aIn, function(e,i){return [e, aOut[i]];})
    

    Explanation:
    Since Javascript doesn't have a tuples type, functions for tuples, lists and sets wasn't a high priority in the language specification.
    Otherwise, similar behavior is accessible in a straightforward manner via Array map in JS >1.6. (map is actually often implemented by JS engine makers in many >JS 1.4 engines, despite not specified).
    The major difference to Python's zip, izip,... results from map's functional style, since map requires a function-argument. Additionally it is a function of the Array-instance. One may use Array.prototype.map instead, if an extra declaration for the input is an issue.

    Example:

    _tarrin = [0..constructor, function(){}, false, undefined, '', 100, 123.324,
             2343243243242343242354365476453654625345345, 'sdf23423dsfsdf',
             'sdf2324.234dfs','234,234fsf','100,100','100.100']
    _parseInt = function(i){return parseInt(i);}
    _tarrout = _tarrin.map(_parseInt)
    _tarrin.map(function(e,i,a){return [e, _tarrout[i]]})
    

    Result:

    //'('+_tarrin.map(function(e,i,a){return [e, _tarrout[i]]}).join('),\n(')+')'
    >>
    (function Number() { [native code] },NaN),
    (function (){},NaN),
    (false,NaN),
    (,NaN),
    (,NaN),
    (100,100),
    (123.324,123),
    (2.3432432432423434e+42,2),
    (sdf23423dsfsdf,NaN),
    (sdf2324.234dfs,NaN),
    (234,234fsf,234),
    (100,100,100),
    (100.100,100)
    

    Related Performance:

    Using map over for-loops:

    See: What is the most efficient way of merging [1,2] and [7,8] into [[1,7], [2,8]]

    zip tests

    Note: the base types such as false and undefined do not posess a prototypal object-hierarchy and thus do not expose a toString function. Hence these are shown as empty in the output.
    As parseInt's second argument is the base/number radix, to which to convert the number to, and since map passes the index as the second argument to its argument-function, a wrapper function is used.

提交回复
热议问题