算法(数据篇)
algorithm cookbook for data manipulation
结构化数据异步回填
- 问题
- 方案
- 讨论
Flatmap
- 问题
- 方案
- 讨论
Compose Functions
问题
需要针对初始数据进行一系列的处理, 每个处理步骤都由指定的
function
完成。 有没有更简单直观的方式去调用呢。const increment = (number) => number + 1; // 增1 const double = (number) => number * 2; // 乘2 const triple = (number) => number * 3; // 乘3 const result = triple(double(increment(1))); // 直觉上会这样去使用
方案
利用
reduce
方法实现的compose
模式const pipeline = [increment, double, triple]; const reducer = function (acc, cur) { return cur(acc); }; // 这里用高阶函数的范式去编写 const compose = (fns) => (init) => fns.reduce(reducer, init); const func = compose(pipeline); const result = func(1);
讨论
- 借鉴了 Unix Piping 思想
- 利用
Reduce
实现 - Code In Unit Test
获取嵌套 property
问题
如何更灵活地,动态地 获取一个 对象嵌套属性 ?
// 直觉上 我们会直接 访问 character.master.master.name const characterA = { name: "悟空", master: { name: "唐僧", master: { name: "观音", }, }, }; const characterB = { name: "唐僧", master: { name: "观音", }, }; // 如果你要迭代处理一个 对象数组, 并且针对相同的 嵌套属性 进行 访问和处理 const characters = [characterA, characterB]; characters.forEach((c, index) => { const masterName = c.master.master.name; // 处理 masterName // 很显然如果这里会抛异常 });
方案
利用
reduce
方法实现的 一级一级的属性访问,如果失败就返回false
const reducer = function (object, propName) { if (object) { return object[propName]; } return false; }; const getNestedPropByPath = (path) => (obj) => path.split(".").reduce(reducer, obj); const characters = [characterA, characterB]; characters.forEach((c, index) => { const masterName = getNestedPropByPath(path)(c); // 处理 masterName // 可以针对 masterName 是否为 falsy 来判断 });
讨论
- 利用
Reduce
实现 - Code In Unit Test
- 利用