Javascript equivalent of Python's zip function

前端 未结 18 1633
天命终不由人
天命终不由人 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 08:12

    You can make utility function by using ES6.

    const zip = (arr, ...arrs) => {
      return arr.map((val, i) => arrs.reduce((a, arr) => [...a, arr[i]], [val]));
    }
    
    // example
    
    const array1 = [1, 2, 3];
    const array2 = ['a','b','c'];
    const array3 = [4, 5, 6];
    
    console.log(zip(array1, array2));                  // [[1, 'a'], [2, 'b'], [3, 'c']]
    console.log(zip(array1, array2, array3));          // [[1, 'a', 4], [2, 'b', 5], [3, 'c', 6]]

    However, in above solution length of the first array defines the length of the output array.

    Here is the solution in which you have more control over it. It's bit complex but worth it.

    function _zip(func, args) {
      const iterators = args.map(arr => arr[Symbol.iterator]());
      let iterateInstances = iterators.map((i) => i.next());
      ret = []
      while(iterateInstances[func](it => !it.done)) {
        ret.push(iterateInstances.map(it => it.value));
        iterateInstances = iterators.map((i) => i.next());
      }
      return ret;
    }
    const array1 = [1, 2, 3];
    const array2 = ['a','b','c'];
    const array3 = [4, 5, 6];
    
    const zipShort = (...args) => _zip('every', args);
    
    const zipLong = (...args) => _zip('some', args);
    
    console.log(zipShort(array1, array2, array3)) // [[1, 'a', 4], [2, 'b', 5], [3, 'c', 6]]
    console.log(zipLong([1,2,3], [4,5,6, 7]))
    // [
    //  [ 1, 4 ],
    //  [ 2, 5 ],
    //  [ 3, 6 ],
    //  [ undefined, 7 ]]

提交回复
热议问题