Ramda 之 Zip

栏目: PHP · 发布时间: 5年前

内容简介:當 Data 為兩個 Array,而結果希望為單一 Array 或單一 Object,我們會使用VS Code 1.33.1Quokka 1.0.209

當 Data 為兩個 Array,而結果希望為單一 Array 或單一 Object,我們會使用 zip 系列的 zip()zipObj()zipWith()zip 也是 FP 很具代表性的 Higher Order Function。

Version

VS Code 1.33.1

Quokka 1.0.209

Ramda 0.26.1

Imperative

let girls = [
  { name: 'Mary' },
  { name: 'Jessie' }
];

let boys = [
  { name: 'John', car: 'BMW' },
  { name: 'Tomy', car: 'TOYOTA' },
  { name: 'Paul', car: 'Benz' }
];

let zip = (arr1, arr2) => {
  let result = [];
  let len = Math.min(arr1.length, arr2.length);

  for (let idx = 0; idx < len; idx++) {
    result[idx] = [arr1[idx], arr2[idx]];
  }

  return result;
};

console.dir(zip(girls, boys));

girlsboys 兩 array 加以合併配對成新 array,其新 length 由較小 array 決定,新 array 同時包含兩個 array 的 element。

若使用 imperative 方式實現,先由 Math.min() 決定 length,會使用 for loop 一一合併配對成新 array 而成為 nested array。

Ramda 之 Zip

Functional

import { map, addIndex, min, max } from 'ramda';

let girls = [
  { name: 'Mary' },
  { name: 'Jessie' }
];

let boys = [
  { name: 'John', car: 'BMW' },
  { name: 'Tomy', car: 'TOYOTA' },
  { name: 'Paul', car: 'Benz' }
];

let mapIndex = addIndex(map);

let zip = (arr1, arr2) => {
  let minArr = min(arr1, arr2);
  let maxArr = max(arr1, arr2);
  return mapIndex((x, i) => [x, maxArr[i]], minArr);
};

console.dir(zip(girls, boys));

由於新 array 的 length 不變,因此也可以使用 map() 處理,不過有幾點必須解決:

  • 由於新 array 的 length 會由較小的 array 決定,因此 map() 的 callback 必須包含 index 參數,此時必須使用 addIndex(map) 產生新的 mapIndex()
  • 再套用 mapIndex() 前,須由 min()max() 決定哪一個 array 比較大,將較小的 array 以 data 傳進 mapIndex()

Ramda 之 Zip

zip()

import { zip } from 'ramda';

const girls = [
  { name: 'Mary' },
  { name: 'Jessie' }
];

const boys = [
  { name: 'John', car: 'BMW' },
  { name: 'Tomy', car: 'TOYOTA' },
  { name: 'Paul', car: 'Benz' }
];

console.dir(zip(girls, boys));

Ramda 已經提供了 zip() ,可將兩個 array 合併配對在一起。

zip()

[a] -> [b] -> [[a], [b]]

將兩個 array 合併配對成單一 array,配對在一起的 element 會在同一個 array

[a] :普通 array

[b] :普通 array

[[a], [b]] :合併配對過的 array

Ramda 之 Zip

zipWith()

import { zipWith } from 'ramda';

const girls = [
  { name: 'Mary' },
  { name: 'Jessie' }
];

const boys = [
  { name: 'John', car: 'BMW' },
  { name: 'Tomy', car: 'TOYOTA' },
  { name: 'Paul', car: 'Benz' }
];

console.dir(zipWith((x, y) => [x, y], girls, boys));

zip() 使適合預設的配對行為,若要自行以 callback 描述配對方式,可以使用 zipWith()

zipWith()

((a, b) → c) → [a] → [b] → [c]

自行提供 callback 的 zip()

((a, b) → c) :callback 描述配對方式

[a] :普通 array

[b] :普通 array

[c] :合併配對過的 array

zip() 相當於 zipWith((x, y) => [x, y])()

import { zipWith } from 'ramda';

let girls = [
  { name: 'Mary' },
  { name: 'Jessie' }
];

let boys = [
  { name: 'John', car: 'BMW' },
  { name: 'Tomy', car: 'TOYOTA' },
  { name: 'Paul', car: 'Benz' }
];

console.dir(zipWith((x, y) => `${x.name}: ${y.car}`, girls, boys));

若配對後我們不希望是 nested array,而是一層 array 內以 string 描述,這種需求 zip() 就做不到,必須使用 zipWith()

Ramda 之 Zip

zipObj()

import { zip, fromPairs, pipe } from 'ramda';

let girls = ['Mary', 'Jessie'];
let cars = ['BMW', 'TOYOTA', 'Benz'];

let zipObj = pipe(
  zip,
  fromPairs
);

console.dir(zipObj(girls, cars));

若兩個 array,各自提供 object property 的 key 與 value,最後合併配對成單一 object。

我們可以將 zip()fromPairs() 加以組合成 zipObj()

Ramda 之 Zip

import { zipObj } from 'ramda';

let girls = ['Mary', 'Jessie'];
let boys = ['BMW', 'TOYOTA', 'Benz'];

console.dir(zipObj(girls, boys));

Ramda 已經提供 zipObj() ,可直接使用。

zipObj()

[String] → [*] → {String: *}

將兩個 array 配對合併成單一 object

[String] :提供 key 的 array

[*] :提供 value 的 array

{String: *} :配對合併成單一 object

Ramda 之 Zip

Conclusion

zip
zip()
zipWith()
zipObj()

Reference

Ramda , min()

Ramda , max()

Ramda , map()

Ramda , addIndex();

Ramda , zip()

Ramda , zipObj()

Ramda , zipWith()

Ramda , fromPairs()


以上所述就是小编给大家介绍的《Ramda 之 Zip》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

自制编程语言 基于C语言

自制编程语言 基于C语言

郑钢 / 人民邮电出版社 / 2018-9-1 / CNY 89.00

本书是一本专门介绍自制编程语言的图书,书中深入浅出地讲述了如何开发一门编程语言,以及运行这门编程语言的虚拟机。本书主要内容包括:脚本语言的功能、词法分析器、类、对象、原生方法、自上而下算符优先、语法分析、语义分析、虚拟机、内建类、垃圾回收、命令行及调试等技术。 本书适合程序员阅读,也适合对编程语言原理感兴趣的计算机从业人员学习。一起来看看 《自制编程语言 基于C语言》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具