Skip to content

Instantly share code, notes, and snippets.

@kurogelee
Created April 15, 2018 06:50
Show Gist options
  • Save kurogelee/7d7715196b7b995c9b0ce8eee28117b1 to your computer and use it in GitHub Desktop.
Save kurogelee/7d7715196b7b995c9b0ce8eee28117b1 to your computer and use it in GitHub Desktop.
TypeScript(JavaScript)で関数型言語の機能をつまみ食いする ref: https://qiita.com/kurogelee/items/59c9a370c5acfc54aff2
npm i -SE lodash ramda
npm i -DE @types/lodash types/npm-ramda#dist
let dataMap = { x: "x1", y: { y1: 1, y2: 2 }, z: "Z" };
console.log("get-in:", // => 2
_.get(dataMap, "y.y2"),
_.get(dataMap, ["y", "y2"]),
R.path(["y", "y2"], dataMap));
console.log("assoc-in:", // => { x: 'x1', y: { y1: 1, y2: 2, y3: 33 }, z: 'Z' }
_.set(dataMap, "y.y3", 33), // dataMapは変更される
_.set(dataMap, ["y", "y3"], 33), // dataMapは変更される
R.assocPath(["y", "y3"], 33, dataMap)); // dataMapは変更されない
dataMap = { x: "x1", y: { y1: 1, y2: 2 }, z: "Z" };
console.log("dissoc-in:", // => { x: 'x1', y: { y1: 1 }, z: 'Z' }
_.omit(dataMap, "y.y2"), // dataMapは変更されない
_.unset(dataMap, "y.y2"), // dataMapは変更される
(() => { dataMap = { x: "x1", y: { y1: 1, y2: 2 }, z: "Z" }; })(),
R.dissocPath(["y", "y2"], dataMap)); // dataMapは変更されない
console.log("update-in:", // => { x: 'x1', y: { y1: 1, y2: 4 }, z: 'Z' }
_.update(dataMap, "y.y2", (data) => data * data), // dataMapは変更される
(() => { dataMap = { x: "x1", y: { y1: 1, y2: 2 }, z: "Z" }; })(),
R.over(R.lensPath(["y", "y2"]), (data: number) => data * data, dataMap)); // dataMapは変更されない
console.log("select-keys:", // => { x: 'x1', z: 'Z' }
_.pick(dataMap, ["x", "z"]),
R.pick(["x", "z"], dataMap));
console.log("entries:", // => [ [ 'x', 'x1' ], [ 'y', { y1: 1, y2: 2 } ], [ 'z', 'Z' ] ]
Object.entries(dataMap),
_.entries(dataMap),
_.toPairs(dataMap),
R.toPairs(dataMap));
// forEach
_.forIn(dataMap, (value, key) => console.log(key + ":" + value));
R.forEachObjIndexed((value, key) => console.log(key + ":" + value), dataMap);
console.log("mapValues:", // => { x: 'x#x1', y: 99, z: 'z#Z' }
_.mapValues(dataMap, (value, key) => typeof (value) === "string" ? `${key}#${value}` : 99),
R.mapObjIndexed((value, key) => typeof (value) === "string" ? `${key}#${value}` : 99, dataMap));
console.log("Objectに対するmap:", // => { '$x': 'x', '$y': 'y', '$z': 'z' }
_(dataMap).toPairs().map(([key, value]) => ["$" + key, key]).fromPairs().value(),
R.fromPairs(R.map(([key, value]) => ["$" + key, key], R.toPairs(dataMap)) as any));
console.log("merge:", // => { x: 'x1', y: 'Y', z: 'Z', zz: 'ZZ' }
Object.assign(dataMap, { y: "Y", zz: "ZZ" }), // dataMapは変更される
_.assign(dataMap, { y: "Y", zz: "ZZ" }), // dataMapは変更される
R.merge(dataMap, { y: "Y", zz: "ZZ" })); // dataMapは変更されない
dataMap = { x: "x1", y: { y1: 1, y2: 2 }, z: "Z" };
console.log("mergeDeep:", // => { x: 'x1', y: { y1: 'YYY', y2: 2 }, z: 'Z' }
_.merge(dataMap, { y: { y1: "YYY" } }), // dataMapは変更される
(() => { dataMap = { x: "x1", y: { y1: 1, y2: 2 }, z: "Z" }; })(),
R.mergeDeepRight(dataMap, { y: { y1: "YYY" } })); // dataMapは変更されない
console.log("merge-with:", // => { x: 'x1X', y: { y1: 1, y2: 2 }, z: 'Z' }
_.mergeWith(dataMap, {x: "X"}, (v1, v2) => v1 + v2), // dataMapは変更される
(() => { dataMap = { x: "x1", y: { y1: 1, y2: 2 }, z: "Z" }; })(),
R.mergeWith((v1: string, v2: string) => v1 + v2, dataMap, {x: "X"})); // dataMapは変更されない
console.log("zipmap:", // => { a: 1, b: 2 }
_.zipObject(["a", "b"], [1, 2]),
R.zipObj(["a", "b"], [1, 2]));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment