配对操作

配对操作分为zipzipWith两种方法。zip操作将两个队列的成员,一一配对,合成一个新的队列。如果两个队列不等长,较长的那个队列多出来的成员,会被忽略。zipWith操作的第一个参数是一个函数,然后会将后面的队列成员一一配对,输入该函数,返回值就组成一个新的队列。

下面是例子。

  1. let a = [0, 1, 2];
  2. let b = [3, 4, 5];
  3. let c = [6, 7, 8];
  4. f.zip(a, b) // [[0, 3], [1, 4], [2, 5]]
  5. f.zipWith((a, b) => a + b, a, b, c) // [9, 12, 15]

上面代码中,zipWith方法的第一个参数是一个求和函数,它将后面三个队列的成员,一一配对进行相加。

这两个方法的实现如下。

  1. let f = {};
  2. f.zip = (...xs) => {
  3. let r = [];
  4. let nple = [];
  5. let length = Math.min.apply(null, xs.map(x => x.length));
  6. for (var i = 0; i < length; i++) {
  7. xs.forEach(
  8. x => nple.push(x[i])
  9. );
  10. r.push(nple);
  11. nple = [];
  12. }
  13. return r;
  14. };
  15. f.zipWith = (op, ...xs) =>
  16. f.zip.apply(null, xs).map(
  17. (x) => x.reduce(op)
  18. );