Useful easy-to-use utilities for JavaScript objects
- Features
- Installation
- Usage
- Examples
.filter().map(),.mapKeyValue.keys,.values,.entries,.length.find(),.findIndex(),.findKey(),.findValue().findLast(),.findLastIndex(),.findLastKey(),.findLastValue().indexOf(),.lastIndexOf(),.indexOfKey().sort(),.sortByValues().some(),.every().omit().flip().reverse()- Chain methods
.transpose()
- Usage with Jest
- Easy to use, w/o
modifying object prototype (
o(obj).filter(...)) - Useful methods that are operable on keys, values and indices (see Examples):
- and properties:
.length.keys,.values,.entries
- Provides an easy way to chain methods
- Typed keys and values
- No dependency, based on modern JS features
- Memory and processor efficient
- Returns
Setinstead ofArrayfor.keys( see: Why doesObject.keys()return anArrayinstead of aSet?)
npm i objectoolsor:
yarn add objectoolsimportofrom'objectools'o({a: 1,b: 2,c: 3}).filter(/*...*/)o({a: 1,b: 2,c: 3}).map(/*...*/)o({a: 1,c: 3,b: 2}).sort()o({...})//...// Or chain methods:o({...}).oFilter(/*...*/).oMap(/*...*/).sort()// Don't prefix the last one with `o`.// I.e. don't write `.oSort()` if you don't want to countinue the chain.o({a: 1,b: 2,c: 3}).filter((value)=>value>1)// {b: 2, c: 3}o({a: 1,b: 2,c: 3}).filter((_,key,index)=>key<'c'&&index>0)// {b: 2}o({a: 1,b: 2,c: 3}).map((value)=>value*2)// {a: 2, b: 4, c: 6}o({a: 1,b: 2,c: 3}).mapKeyValue((value,key)=>[key.toUpperCase(),value-1])// {A: 0, B: 1, C: 2}o({a: 1,b: 2,c: 3}).keys// Set {'a', 'b', 'c'} // Type: `Set<'a' | 'b' | 'c'>`o({a: 1,b: 2,c: 3}).values// [1, 2, 3] // Type: `number[]`o({a: 1,b: 2,c: 3}).entries// [['a', 1], ['b', 2], ['c', 3]] // Type: ['a' | 'b' | 'c', number][]o({a: 1,b: 2,c: 3}).length// 3.find(), .findIndex(), .findKey(), .findValue()
o({a: 1,b: 2,c: 3}).find((value)=>value>1)// ['b', 2]o({a: 1,b: 2,c: 3}).findIndex((value)=>value>1)// 1o({a: 1,b: 2,c: 3}).findKey((value)=>value>1)// 'b'o({a: 1,b: 2,c: 3}).findValue((value)=>value>1)// 2.findLast(), .findLastIndex(), .findLastKey(), .findLastValue()
o({a: 1,b: 2,c: 3}).findLast((value)=>value>1)// ['c', 3]o({a: 1,b: 2,c: 3}).findLastIndex((value)=>value>1)// 2o({a: 1,b: 2,c: 3}).findLastKey((value)=>value>1)// 'c'o({a: 1,b: 2,c: 3}).findLastValue((value)=>value>1)// 3.indexOf(), .lastIndexOf(), .indexOfKey()
o({a: 3,b: 3}).indexOf(3)// 0o({a: 3,b: 3}).lastIndexOf(3)// 1o({a: 3,b: 3}).indexOfKey('b')// 1.sort(), .sortByValues()
o({b: 1,a: 3,c: 2}).sort()// {a: 3, b: 1, c: 2}o({b: 1,a: 3,c: 2}).sortByValues()// {b: 1, c: 2, a: 3}o({a: 1,b: 2,c: 3}).some((value)=>value>1)// trueo({a: 1,b: 2,c: 3}).every((value)=>value>1)// falseo({a: 1,b: 2,c: 3}).omit('b')// {a: 1, c: 3}o({a: 1,b: 2,c: 3}).omit('c','a')// {b: 2}o({a: 'x',b: 'y'}).flip()// {x: 'a', y: 'b'}o({a: 'x',b: 'y'}).reverse()// {b: 'y', a: 'x'}o({b: 1,a: 2,c: 3}).oFilter((value)=>value<3).oMap((value)=>value*2).sort()// --> {a: 4, b: 2}o({x: {a: 1,b: 2},y: {a: 3,b: 4},z: {a: 5,b: 6},}).transpose()// -->// {// a: {x: 1, y: 3, z: 5},// b: {x: 2, y: 4, z: 6},// }Usage with Jest
You may need to add this to your "jest.config.js" file:
exportdefault{transformIgnorePatterns: [// These packages are created based on modern javascript and use ESM module system (import/export). But Jest use// old common-js module-system. So we need to transform these files using babel, too (like source files). Note that// "node_modules" folder is ignored by default, and we've EXCLUDED these packages from this general rule (see `?!`// in the below regex).'/node_modules/(?!(objectools)/)',}