Just
A library of dependency-free JavaScript utilities that do just one thing.
README
Just
Docs | Why? | Try It | Contribute!
A library of zero-dependency npm modules that do just one thing.
A guilt-free alternative to those bulkier utility libraries. Ideal for PWA development or whenever bytes are precious.
We welcome contributions. Please follow our contribution guidelines.
Try :icecream:

Read :books:
- TRADEOFFS.md -- When to use Just (and when not to).
- The Zen of Dependency-Free -- Why I wrote Just.
All packages support ES module or Common JS syntax without requiring transpilation
- ```
 - // esm (node / bundler)
 - import clone from 'just-clone';
 - // esm (native browser code)
 - import clone from './node_modules/just-clone/index.mjs';
 - // cjs
 - const clone = require('just-clone');
 - ```
 
We've now added TypeScript definitions and tests for every Just utility
Browser/Platform Support :computer:
Most utilities still work with any platform that supports ES5, but these are the earliest versions guranteed to support _every_ utility. For guidance, any platform that supports spread in array literals will work with Just.
| Chrome | Safari | Firefox | Edge | Node | Mobile | Android | 
|---|---|---|---|---|---|---|
| ------ | ------ | ------- | ---- | ---- | ------------- | ------------- | 
| 46 | 8 | 16 | 12 | 6.0 | 8 | 46 | 
The Modules :package:
- Collections {}[]
- Objects {}
  - just-has
- Arrays []
- Statistics Σ
- Strings ""
- Numbers +-
- Functions =>
Collections
[🍦 Try it](https://anguscroll.com/just/just-diff)
- ``` sh
 - npm install just-diff
 - ```
 
- ``` sh
 - yarn add just-diff
 - ```
 
Return an object representing the difference between two other objects
Pass converter to format as http://jsonpatch.com
- ``` js
 - import {diff} from 'just-diff';
 - const obj1 = {a: 4, b: 5};
 - const obj2 = {a: 3, b: 5};
 - const obj3 = {a: 4, c: 5};
 - diff(obj1, obj2);
 - [
 - { "op": "replace", "path": ['a'], "value": 3 }
 - ]
 - diff(obj2, obj3);
 - [
 - { "op": "remove", "path": ['b'] },
 - { "op": "replace", "path": ['a'], "value": 4 }
 - { "op": "add", "path": ['c'], "value": 5 }
 - ]
 - // using converter to generate jsPatch standard paths
 - import {diff, jsonPatchPathConverter} from 'just-diff'
 - diff(obj1, obj2, jsonPatchPathConverter);
 - [
 - { "op": "replace", "path": '/a', "value": 3 }
 - ]
 - diff(obj2, obj3, jsonPatchPathConverter);
 - [
 - { "op": "remove", "path": '/b' },
 - { "op": "replace", "path": '/a', "value": 4 }
 - { "op": "add", "path": '/c', "value": 5 }
 - ]
 - // arrays
 - const obj4 = {a: 4, b: [1, 2, 3]};
 - const obj5 = {a: 3, b: [1, 2, 4]};
 - const obj6 = {a: 3, b: [1, 2, 4, 5]};
 - diff(obj4, obj5);
 - [
 - { "op": "replace", "path": ['a'], "value": 3 }
 - { "op": "replace", "path": ['b', 2], "value": 4 }
 - ]
 - diff(obj5, obj6);
 - [
 - { "op": "add", "path": ['b', 3], "value": 5 }
 - ]
 - // nested paths
 - const obj7 = {a: 4, b: {c: 3}};
 - const obj8 = {a: 4, b: {c: 4}};
 - const obj9 = {a: 5, b: {d: 4}};
 - diff(obj7, obj8);
 - [
 - { "op": "replace", "path": ['b', 'c'], "value": 4 }
 - ]
 - diff(obj8, obj9);
 - [
 - { "op": "replace", "path": ['a'], "value": 5 }
 - { "op": "remove", "path": ['b', 'c']}
 - { "op": "add", "path": ['b', 'd'], "value": 4 }
 - ]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-diff-apply)
- ``` sh
 - npm install just-diff-apply
 - ```
 
- ``` sh
 - yarn add just-diff-apply
 - ```
 
Apply a diff object to an object. Pass converter to apply a http://jsonpatch.com standard patch
- ``` js
 - import {diffApply} from 'just-diff-apply';
 - const obj1 = {a: 3, b: 5};
 - diffApply(obj1,
 - [
 - { "op": "remove", "path": ['b'] },
 - { "op": "replace", "path": ['a'], "value": 4 },
 - { "op": "add", "path": ['c'], "value": 5 }
 - ]
 - );
 - obj1; // {a: 4, c: 5}
 - const obj2 = {a: 3, b: 5};
 - diffApply(obj2,
 - [
 - { "op": "move", "from": ['a'], "path": ['c']},
 - ]
 - );
 - obj2; // {b: 5, c: 3}
 - // using converter to apply jsPatch standard paths
 - // see http://jsonpatch.com
 - import {diffApply, jsonPatchPathConverter} from 'just-diff-apply'
 - const obj3 = {a: 3, b: 5};
 - diffApply(obj3, [
 - { "op": "remove", "path": '/b' },
 - { "op": "replace", "path": '/a', "value": 4 }
 - { "op": "add", "path": '/c', "value": 5 }
 - ], jsonPatchPathConverter);
 - obj3; // {a: 4, c: 5}
 - // arrays (array key can be string or numeric)
 - const obj4 = {a: 4, b: [1, 2, 3]};
 - diffApply(obj4, [
 - { "op": "replace", "path": ['a'], "value": 3 }
 - { "op": "replace", "path": ['b', 2], "value": 4 }
 - { "op": "add", "path": ['b', 3], "value": 9 }
 - ]);
 - obj4; // {a: 3, b: [1, 2, 4, 9]}
 - // nested paths
 - const obj5 = {a: 4, b: {c: 3}};
 - diffApply(obj5, [
 - { "op": "replace", "path": ['a'], "value": 5 }
 - { "op": "remove", "path": ['b', 'c']}
 - { "op": "add", "path": ['b', 'd'], "value": 4 }
 - ]);
 - obj5; // {a: 5, b: {d: 4}}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-compare)
- ``` sh
 - npm install just-compare
 - ```
 
- ``` sh
 - yarn add just-compare
 - ```
 
Compare two collections
- ``` js
 - import compare from 'just-compare';
 - // primitives: value1 === value2
 - // functions: value1.toString == value2.toString
 - // arrays: if length, sequence and values of properties are identical
 - // objects: if length, names and values of properties are identical
 - compare([1, [2, 3]], [1, [2, 3]]); // true
 - compare([1, [2, 3], 4], [1, [2, 3]]); // false
 - compare({a: 2, b: 3}, {a: 2, b: 3}); // true
 - compare({a: 2, b: 3}, {b: 3, a: 2}); // true
 - compare({a: 2, b: 3, c: 4}, {a: 2, b: 3}); // false
 - compare({a: 2, b: 3}, {a: 2, b: 3, c: 4}); // false
 - compare([1, [2, {a: 4}], 4], [1, [2, {a: 4}]]); // false
 - compare([1, [2, {a: 4}], 4], [1, [2, {a: 4}], 4]); // true
 - compare(NaN, NaN); // true
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-clone)
- ``` sh
 - npm install just-clone
 - ```
 
- ``` sh
 - yarn add just-clone
 - ```
 
Deep copies objects, arrays, maps and sets
- ``` js
 - // Deep copies objects and arrays, doesn't clone functions
 - import clone from 'just-clone';
 - var arr = [1, 2, 3];
 - var subObj = { aa: 1 };
 - var obj = { a: 3, b: 5, c: arr, d: subObj };
 - var objClone = clone(obj);
 - arr.push(4);
 - objClone.d.bb = 2;
 - obj; // {a: 3, b: 5, c: [1, 2, 3, 4], d: {aa: 1}}
 - objClone; // {a: 3, b: 5, c: [1, 2, 3], d: {aa: 1, bb: 2}}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-pluck-it)
- ``` sh
 - npm install just-pluck-it
 - ```
 
- ``` sh
 - yarn add just-pluck-it
 - ```
 
Pluck a property from each member of a collection
- ``` js
 - import pluck from 'just-pluck-it';
 - pluck([{a:1, b:2}, {a:4, b:3}, {a:2, b:5}], 'a'); // [1, 4, 2]
 - pluck({x: {a:1, b:2}, y: {a:4, b:3}, z: {a:2, b:5}}, 'a'); // {x: 1, y: 4, z: 2}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-flush)
- ``` sh
 - npm install just-flush
 - ```
 
- ``` sh
 - yarn add just-flush
 - ```
 
Returns a copy of an array or object with null/undefined members removed
- ``` js
 - import flush from 'just-flush';
 - flush([1, undefined, 2, null, 3, NaN, 0]); // [1, 2, 3, NaN, 0]
 - flush([true, null, false, true, [null], undefined]); // [true, false, true, [null]]
 - flush({a: 2, b: null, c: 4, d: undefined}); // {a: 2, c: 4}
 - flush('something'); // undefined
 - flush(); // undefined
 - ```
 
Objects
[🍦 Try it](https://anguscroll.com/just/just-extend)
- ``` sh
 - npm install just-extend
 - ```
 
- ``` sh
 - yarn add just-extend
 - ```
 
Extend an object
- ``` js
 - import extend from 'just-extend';
 - var obj = {a: 3, b: 5};
 - extend(obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}
 - obj; // {a: 4, b: 5, c: 8}
 - var obj = {a: 3, b: 5};
 - extend({}, obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}
 - obj; // {a: 3, b: 5}
 - var arr = [1, 2, 3];
 - var obj = {a: 3, b: 5};
 - extend(obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}
 - arr.push(4);
 - obj; // {a: 3, b: 5, c: [1, 2, 3, 4]}
 - var arr = [1, 2, 3];
 - var obj = {a: 3, b: 5};
 - extend(true, obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}
 - arr.push(4);
 - obj; // {a: 3, b: 5, c: [1, 2, 3]}
 - extend({a: 4, b: 5}); // {a: 4, b: 5}
 - extend({a: 4, b: 5}, 3); {a: 4, b: 5}
 - extend({a: 4, b: 5}, true); {a: 4, b: 5}
 - extend('hello', {a: 4, b: 5}); // throws
 - extend(3, {a: 4, b: 5}); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-merge)
- ``` sh
 - npm install just-merge
 - ```
 
- ``` sh
 - yarn add just-merge
 - ```
 
Shallow assign. Like just-extend but without deep copy option.
- ``` js
 - import merge from 'just-merge';
 - let obj = {a: 3, b: 5};
 - merge(obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}
 - obj; // {a: 4, b: 5, c: 8}
 - let obj = {a: 3, b: 5};
 - merge({}, obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}
 - obj; // {a: 3, b: 5}
 - let arr = [1, 2, 3];
 - let obj = {a: 3, b: 5};
 - merge(obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}
 - arr.push[4];
 - obj; // {a: 3, b: 5, c: [1, 2, 3, 4]}
 - merge({a: 4, b: 5}); // {a: 4, b: 5}
 - merge(3, {a: 4, b: 5}); // throws
 - merge({a: 4, b: 5}, 3); // throws
 - merge({a: 4, b: 5}, {b: 4, c: 5}, 'c'); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-values)
- ``` sh
 - npm install just-values
 - ```
 
- ``` sh
 - yarn add just-values
 - ```
 
Return property values as an array
- ``` js
 - const values = require('just-values');
 - values({a: 4, c: 8}); // [4, 8]
 - values({a: {aa: 2}, b: {bb: 4}}); // [{aa: 2}, {bb: 4}]
 - values({}); // []
 - values([1, 2, 3]); // [1, 2, 3]
 - values(function(a, b) {return a + b;}); // []
 - values(new String('hello')); // ['h', 'e', 'l', 'l', 'o']
 - values(1); // throws exception
 - values(true); // throws exception
 - values(undefined); // throws exception
 - values(null); // throws exception
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-entries)
- ``` sh
 - npm install just-entries
 - ```
 
- ``` sh
 - yarn add just-entries
 - ```
 
Return object entries as an array of [key, value] pairs
- ``` js
 - import entries from 'just-entries';
 - // Object:
 - entries({c: 8, a: 4}); // [['c', 8], ['a', 4]]
 - entries({b: {bb: 4}, a: {aa: 2}}); // [['b', {bb: 4}], ['a', {aa: 2}]]
 - entries({}); // []
 - // Array:
 - entries([{c: 8}, {a: 4}]); // [[0, {c: 8}], [1, {a: 4}]]
 - entries(['À', 'mauvais', 'ouvrier', 'point', 'de', 'bon', 'outil'])
 - // [[0, 'À'], [1, 'mauvais'] ... [6, 'outil']]
 - entries([]); // []
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-pick)
- ``` sh
 - npm install just-pick
 - ```
 
- ``` sh
 - yarn add just-pick
 - ```
 
Copy an object but with only the specified keys
- ``` js
 - import pick from 'just-pick';
 - var obj = { a: 3, b: 5, c: 9 };
 - pick(obj, ['a', 'c']); // {a: 3, c: 9}
 - pick(obj, 'a', 'c'); // {a: 3, c: 9}
 - pick(obj, ['a', 'b', 'd']); // {a: 3, b: 5}
 - pick(obj, ['a', 'a']); // {a: 3}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-omit)
- ``` sh
 - npm install just-omit
 - ```
 
- ``` sh
 - yarn add just-omit
 - ```
 
Copy an object but omit the specified keys
- ``` js
 - import omit from 'just-omit';
 - var obj = {a: 3, b: 5, c: 9};
 - omit(obj, ['a', 'c']); // {b: 5}
 - omit(obj, 'a', 'c'); // {b: 5}
 - omit(obj, ['a', 'b', 'd']); // {c: 9}
 - omit(obj, ['a', 'a']); // {b: 5, c: 9}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-is-empty)
- ``` sh
 - npm install just-is-empty
 - ```
 
- ``` sh
 - yarn add just-is-empty
 - ```
 
Return true if object has no enumerable key values
- ``` js
 - import isEmpty from 'just-is-empty';
 - isEmpty({a: 3, b: 5}) // false
 - isEmpty([1, 2]) // false
 - isEmpty(new Set([1, 2, 2])) // false
 - isEmpty((new Map()).set('a', 2)) // false
 - isEmpty({}) // true
 - isEmpty([]) // true
 - isEmpty(new Set()) // true
 - isEmpty(new Map()) // true
 - isEmpty('abc') // false
 - isEmpty('') // true
 - isEmpty(0) // true
 - isEmpty(1) // true
 - isEmpty(true) // true
 - isEmpty(Symbol('abc')); // true
 - isEmpty(//); // true
 - isEmpty(new String('abc')); // false
 - isEmpty(new String('')); // true
 - isEmpty(new Boolean(true)); // true
 - isEmpty(null) // true
 - isEmpty(undefined) // true
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-is-circular)
- ``` sh
 - npm install just-is-circular
 - ```
 
- ``` sh
 - yarn add just-is-circular
 - ```
 
Return true if object has a circular reference
NOTE: not supported in IE or microsoft edge
- ``` js
 - import isCircular from 'just-is-circular';
 - const a = {};
 - a.b = a;
 - isCircular(a); // true
 - const a = {};
 - a.b = {
 - c: a
 - };
 - isCircular(a); // true
 - const a = {};
 - a.b = {
 - c: 4
 - };
 - isCircular(a); // false
 - const a = [];
 - a.push(a);
 - isCircular(a); // true
 - isCircular({}); // false
 - isCircular('hi'); // false
 - isCircular(undefined); // false
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-is-primitive)
- ``` sh
 - npm install just-is-primitive
 - ```
 
- ``` sh
 - yarn add just-is-primitive
 - ```
 
Determine if a value is a primitive value
- ``` js
 - import isPrimitive from 'just-is-primitive';
 - isPrimitive('hi') // true
 - isPrimitive(3) // true
 - isPrimitive(true) // true
 - isPrimitive(false) // true
 - isPrimitive(null) // true
 - isPrimitive(undefined) // true
 - isPrimitive(Symbol()) // true
 - isPrimitive({}) // false
 - isPrimitive([]) // false
 - isPrimitive(function() {}) // false
 - isPrimitive(new Date()) // false
 - isPrimitive(/a/) // false
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-filter-object)
- ``` sh
 - npm install just-filter-object
 - ```
 
- ``` sh
 - yarn add just-filter-object
 - ```
 
Filter an object
- ``` js
 - import filter from 'just-filter';
 - // returns a new object containing those original properties for which the predicate returns truthy
 - filter({a: 3, b: 5, c: 9}, (key, value) => value < 6); // {a: 3, b: 5}
 - filter({a1: 3, b1: 5, a2: 9}, (key, value) => key[0] == 'a'); // {a1: 3, a2: 9}
 - filter({a: 3, b: 5, c: null}, (key, value) => value); // {a: 3, b: 5}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-map-object)
- ``` sh
 - npm install just-map-object
 - ```
 
- ``` sh
 - yarn add just-map-object
 - ```
 
Map an object, passing key and value to predicates
- ``` js
 - import map from 'just-map-object';
 - // DEPRECATED: use just-map-values
 - map({a: 3, b: 5, c: 9}, (key, value) => value + 1); // {a: 4, b: 6, c: 10}
 - map({a: 3, b: 5, c: 9}, (key, value) => key); // {a: 'a', b: 'b', c: 'c'}
 - map({a: 3, b: 5, c: 9}, (key, value) => key + value); // {a: 'a3', b: 'b5', c: 'c9'}```
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-map-values)
- ``` sh
 - npm install just-map-values
 - ```
 
- ``` sh
 - yarn add just-map-values
 - ```
 
Map an object, predicate updates values, receives (value, key, object)
- ``` js
 - import map from 'just-map-values';
 - // predicate updates values, receives (value, key, obj)
 - map({a: 3, b: 5, c: 9}, (value) => value + 1); // {a: 4, b: 6, c: 10}
 - map({a: 3, b: 5, c: 9}, (value, key) => value + key); // {a: 3a, b: 5b, c: 9c}
 - map({a: 3, b: 5, c: 9}, (value, key, obj) => obj.b); // {a: 5, b: 5, c: 5}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-map-keys)
- ``` sh
 - npm install just-map-keys
 - ```
 
- ``` sh
 - yarn add just-map-keys
 - ```
 
Map an object, predicate updates keys, receives (value, key, object)
- ``` js
 - import map from 'just-map-keys';
 - // predicate updates keys, receives (value, key, object)
 - map({a: 'cow', b: 'sheep', c: 'pig'}, (value) => value);
 - // {cow: 'cow', sheep: 'sheep', pig: 'pig'}
 - map([4, 5, 6], (value, key) => key + 1); // {1: 4, 2: 5, 3: 6}
 - map({a: 3, b: 5, c: 9}, (value, key) => key + value); // {a3: 3, b5: 5, c9: 9}
 - map({a: 3, b: 5, c: 9}, (value, key, obj) => obj.b + value + key);
 - // {'8a': 3, '10b': 5, '14c': 9}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-deep-map-values)
- ``` sh
 - npm install just-deep-map-values
 - ```
 
- ``` sh
 - yarn add just-deep-map-values
 - ```
 
Returns an object with values at all depths mapped according to the provided function
- ``` js
 - import deepMapValues from 'just-deep-map-values';
 - const squareFn = (number) => number * number;
 - deepMapValues({ a: 1, b: { c: 2, d: { e: 3 } } }, squareFn); // => { a: 1, b: { c: 4, d: { e: 9 } } }
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-reduce-object)
- ``` sh
 - npm install just-reduce-object
 - ```
 
- ``` sh
 - yarn add just-reduce-object
 - ```
 
Reduce an object
- ``` js
 - import reduce from 'just-reduce-object';
 - // applies a function against an accumulator and each key-value pairs of the object
 - // to reduce it to a single value
 - reduce({a: 3, b: 5, c: 9}, (acc, key, value, index, keys) => {
 - acc[value] = key;
 - return acc;
 - }, {}); // {3: 'a', 5: 'b', 9: 'c'}
 - reduce({a: 3, b: 5, c: 9}, (acc, key, value, index, keys) => {
 - acc += value;
 - return acc;
 - }); // 17
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-safe-get)
- ``` sh
 - npm install just-safe-get
 - ```
 
- ``` sh
 - yarn add just-safe-get
 - ```
 
Get value at property, don't throw if parent is undefined
- ``` js
 - import get from 'just-safe-get';
 - const obj = {a: {aa: {aaa: 2}}, b: 4};
 - get(obj, 'a.aa.aaa'); // 2
 - get(obj, ['a', 'aa', 'aaa']); // 2
 - get(obj, 'b.bb.bbb'); // undefined
 - get(obj, ['b', 'bb', 'bbb']); // undefined
 - get(obj.a, 'aa.aaa'); // 2
 - get(obj.a, ['aa', 'aaa']); // 2
 - get(obj.b, 'bb.bbb'); // undefined
 - get(obj.b, ['bb', 'bbb']); // undefined
 - get(obj.b, 'bb.bbb', 5); // 5
 - get(obj.b, ['bb', 'bbb'], true); // true
 - get(null, 'a'); // undefined
 - get(undefined, ['a']); // undefined
 - get(null, 'a', 42); // 42
 - get(undefined, ['a'], 42); // 42
 - const obj = {a: {}};
 - const sym = Symbol();
 - obj.a[sym] = 4;
 - get(obj.a, sym); // 4
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-safe-set)
- ``` sh
 - npm install just-safe-set
 - ```
 
- ``` sh
 - yarn add just-safe-set
 - ```
 
Set value at property, create intermediate properties if necessary
- ``` js
 - import set from 'just-safe-set';
 - const obj1 = {};
 - set(obj1, 'a.aa.aaa', 4); // true
 - obj1; // {a: {aa: {aaa: 4}}}
 - const obj2 = {};
 - set(obj2, ['a', 'aa', 'aaa'], 4); // true
 - obj2; // {a: {aa: {aaa: 4}}}
 - const obj3 = {a: {aa: {aaa: 2}}};
 - set(obj3, 'a.aa.aaa', 3); // true
 - obj3; // {a: {aa: {aaa: 3}}}
 - // don't clobber existing
 - const obj4 = {a: {aa: {aaa: 2}}};
 - set(obj4, 'a.aa', {bbb: 7}); // false
 - const obj5 = {a: {}};
 - const sym = Symbol();
 - set(obj5.a, sym, 7); // true
 - obj5; // {a: {Symbol(): 7}}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-typeof)
- ``` sh
 - npm install just-typeof
 - ```
 
- ``` sh
 - yarn add just-typeof
 - ```
 
Type inferer
- ``` js
 - import typeOf from 'just-typeof';
 - typeOf({}); // 'object'
 - typeOf([]); // 'array'
 - typeOf(function() {}); // 'function'
 - typeOf(/a/); // 'regexp'
 - typeOf(new Date()); // 'date'
 - typeOf(null); // 'null'
 - typeOf(undefined); // 'undefined'
 - typeOf('a'); // 'string'
 - typeOf(1); // 'number'
 - typeOf(true); // 'boolean'
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-flip-object)
- ``` sh
 - npm install just-flip-object
 - ```
 
- ``` sh
 - yarn add just-flip-object
 - ```
 
Flip the keys and values
- ``` js
 - import flip from 'just-flip-object';
 - // flip the key and value
 - flip({a: 'x', b: 'y', c: 'z'}); // {x: 'a', y: 'b', z: 'c'}
 - flip({a: 1, b: 2, c: 3}); // {'1': 'a', '2': 'b', '3': 'c'}
 - flip({a: false, b: true}); // {false: 'a', true: 'b'}
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-has)
- ``` sh
 - npm install just-has
 - ```
 
- ``` sh
 - yarn add just-has
 - ```
 
Return a boolen indicating the existence of a deep property, don't throw if parent is undefined
- ``` js
 - import has from 'just-has';
 - const obj = {a: {aa: {aaa: 2}}, b: 4};
 - has(obj, 'a.aa.aaa'); // true
 - has(obj, ['a', 'aa', 'aaa']); // true
 - has(obj, 'b.bb.bbb'); // false
 - has(obj, ['b', 'bb', 'bbb']); // false
 - has(obj.a, 'aa.aaa'); // true
 - has(obj.a, ['aa', 'aaa']); // true
 - has(obj.b, 'bb.bbb'); // false
 - has(obj.b, ['bb', 'bbb']); // false
 - has(null, 'a'); // false
 - has(undefined, ['a']); // false
 - const obj = {a: {}};
 - const sym = Symbol();
 - obj.a[sym] = 4;
 - has(obj.a, sym); // true
 - ```
 
Arrays
[🍦 Try it](https://anguscroll.com/just/just-cartesian-product)
- ``` sh
 - npm install just-cartesian-product
 - ```
 
- ``` sh
 - yarn add just-cartesian-product
 - ```
 
Takes an input of an array of arrays and returns their Cartesian product.
- ``` js
 - import cartesianProduct from 'just-cartesian-product';
 - cartesianProduct([[1, 2], ['a', 'b']]); // [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]
 - cartesianProduct([[1, 2], ['a', 'b', 'c']]); // [[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], [2, 'b'], [2, 'c']]
 - cartesianProduct([]); // []
 - cartesianProduct(); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-unique)
- ``` sh
 - npm install just-unique
 - ```
 
- ``` sh
 - yarn add just-unique
 - ```
 
Dedupes an array
- ``` js
 - import unique from 'just-unique';
 - unique([1, 2, 3, 2, 3, 4, 3, 2, 1, 3]); // [1, 2, 3, 4]
 - var a = {a: 3};
 - var b = {b: 4};
 - var c = {c: 5};
 - unique([a, a, b, c, b]); // [a, b, c]
 - unique([1, '1', 2, '2', 3, 2]); // [1, '1', 2, '2', 3]
 - // declaring sorted array for performance
 - unique([1, 1, '1', 2, 2, 5, '5', '5'], true); // [1, '1', 2, 5, '6']
 - // declaring strings array for performance
 - unique(['a', 'c', 'b', 'c', 'a'], false, true); // ['a', 'b', 'c']
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-flatten-it)
- ``` sh
 - npm install just-flatten-it
 - ```
 
- ``` sh
 - yarn add just-flatten-it
 - ```
 
Return a flattened array
- ``` js
 - import flatten from 'just-flatten-it';
 - flatten([[1, [2, 3]], [[4, 5], 6, 7, [8, 9]]]);
 - // [1, 2, 3, 4, 5, 6, 7, 8, 9]
 - flatten([[1, [2, 3]], [[4, 5], 6, 7, [8, 9]]], 1);
 - // [1, [2, 3], [[4, 5], 6, 7, [8, 9]]]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-index)
- ``` sh
 - npm install just-index
 - ```
 
- ``` sh
 - yarn add just-index
 - ```
 
Return an object from an array, keyed by the value at the given id
- ``` js
 - import index from 'just-index';
 - index([{id: 'first', val: 1}, {id: 'second', val: 2}], 'id');
 - // {first: {id: 'first', val: 1}, second: {id: 'second', val: 2}}
 - index([{id: 'first', val: 1}, null], 'id'); // {first: {id: 'first', val: 1}}
 - index([], 'id'); // {}
 - index([], null); // undefined
 - index({}, 'id'); // undefined
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-insert)
- ``` sh
 - npm install just-insert
 - ```
 
- ``` sh
 - yarn add just-insert
 - ```
 
Inserts a sub-array into an array starting at the given index. Returns a copy
- ``` js
 - import insert from 'just-insert';
 - insert([1, 2, 5, 6], ['a', 'c', 'e'], 2); // [1, 2, 'a', 'c', 'e', 5, 6]
 - insert([1, 2, 5, 6], 'a', 2); // [1, 2, 'a', 5, 6]
 - insert([1, 2, 5, 6], ['a', 'c', 'e'], 0); // ['a', 'c', 'e', 1, 2, 5, 6]
 - insert([1, 2, 5, 6], ['a', 'c', 'e']); // ['a', 'c', 'e', 1, 2, 5, 6]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-intersect)
- ``` sh
 - npm install just-intersect
 - ```
 
- ``` sh
 - yarn add just-intersect
 - ```
 
Return the intersect of two arrays
- ``` js
 - import intersect from 'just-intersect';
 - intersect([1, 2, 5, 6], [2, 3, 5, 6]); // [2, 5, 6]
 - intersect([1, 2, 2, 4, 5], [3, 2, 2, 5, 7]); // [2, 5]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-compact)
- ``` sh
 - npm install just-compact
 - ```
 
- ``` sh
 - yarn add just-compact
 - ```
 
Returns a copy of an array with falsey values removed
- ``` js
 - import compact from 'just-compact';
 - compact([1, null, 2, undefined, null, NaN, 3, 4, false, 5]); // [1, 2, 3, 4, 5]
 - compact([1, 2, [], 4, {}]); // [1, 2, [], 4, {}]
 - compact([]); // []
 - compact({}); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-last)
- ``` sh
 - npm install just-last
 - ```
 
- ``` sh
 - yarn add just-last
 - ```
 
Return the last member of an array
- ``` js
 - import last from 'just-last';
 - last([1, 2, 3, 4, 5]); // 5
 - last([{a: 1}, {b: 1}, {c: 1}]); // {c: 1}
 - last([true, false, [true, false]]); // [true, false]
 - last(); // undefined
 - last([]); // undefined
 - last(null); // undefined
 - last(undefined); // undefined
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-tail)
- ``` sh
 - npm install just-tail
 - ```
 
- ``` sh
 - yarn add just-tail
 - ```
 
Return all but the first element of an array
- ``` js
 - import tail from 'just-tail';
 - tail([1, 2, 3, 4, 5]); // [2, 3, 4, 5]
 - tail([{a: 1}, {b: 1}, {c: 1}]); // [{b: 1}, {c: 1}]
 - tail([true, false, [true, false]]); // [false, [true, false]]
 - tail([]); // []
 - tail(); // undefined
 - tail(null); // undefined
 - tail(undefined); // undefined
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-random)
- ``` sh
 - npm install just-random
 - ```
 
- ``` sh
 - yarn add just-random
 - ```
 
Return a randomly selected element in an array
- ``` js
 - import random from 'just-random';
 - random([1, 2, 3]);
 - // one of [1, 2, 3], at random
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-shuffle)
- ``` sh
 - npm install just-shuffle
 - ```
 
- ``` sh
 - yarn add just-shuffle
 - ```
 
Return the elements of an array in random order
- ``` js
 - import shuffle from 'just-shuffle';
 - shuffle([1, 2, 3]);
 - // array with original elements randomly sorted
 - shuffle([1, 2, 3], {shuffleAll: true});
 - // array with original elements randomly sorted and all in new postions
 - shuffle([]); // []
 - shuffle([1]); // [1]
 - shuffle(); // throws
 - shuffle(undefined); // throws
 - shuffle(null); // throws
 - shuffle({}); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-split)
- ``` sh
 - npm install just-split
 - ```
 
- ``` sh
 - yarn add just-split
 - ```
 
Splits array into groups of n items each
- ``` js
 - import split from 'just-split';
 - split([]); // []
 - split([1, 2, 3, 4, 5]); // [[1, 2, 3, 4, 5]]
 - split([1, 2, 3, 4, 5, 6, 7, 8, 9], 3); // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 - split([1, 2, 3, 4, 5, 6, 7, 8, 9], '3'); // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 - split(['a', 'b', 'c', 'd', 'e'], 2); // [['a', 'b'], ['c', 'd'], ['e']]
 - split([1, 2, 3, 4, 5, 6, 7, 8], 3); // [[1, 2, 3], [4, 5, 6], [7, 8]]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-split-at)
- ``` sh
 - npm install just-split-at
 - ```
 
- ``` sh
 - yarn add just-split-at
 - ```
 
Splits an array into two at a given position
- ``` js
 - import splitAt from 'just-split-at';
 - splitAt([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4, 5]]
 - splitAt([{a: 1}, {b: 1}, {c: 1}], -1); // [[{a: 1}, {b: 1}], [{c: 1}]]
 - splitAt([], 2); // [[], []]
 - splitAt(null, 1); // throws
 - splitAt(undefined, 1); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-sort-by)
- ``` sh
 - npm install just-sort-by
 - ```
 
- ``` sh
 - yarn add just-sort-by
 - ```
 
Produces a new array, sorted in ascending order
- ``` js
 - import sortBy from 'just-sort-by';
 - sortBy([10, 1, 5, 20, 15, 35, 30, 6, 8]); // [1, 5, 6, 8, 10, 15, 20, 30, 35]
 - sortBy([
 - {user: 'fabio', details: {city: "Milan", age: 34}},
 - {user: 'max', details: {city: "Munich", age: 29}},
 - {user: 'zacarias', details: {city: "Sao Paulo", age: 44}},
 - {user: 'robert', details: {city: "Manchester", age: 28}},
 - {user: 'klaus', details: {city: "Zurich", age: 38}},
 - ], function(o) {
 - return o.details.age;
 - });
 - /*
 - [
 - {user: 'robert', age: 28},
 - {user: 'max', age: 29},
 - {user: 'fabio', age: 34},
 - {user: 'klaus', age: 38},
 - {user: 'zacarias', age: 44},
 - ]
 - */
 - sortBy([
 - {user: 'fabio', age: 34},
 - {user: 'max', age: 29},
 - {user: 'zacarias', age: 44},
 - {user: 'robert', age: 28},
 - {user: 'klaus', age: 38},
 - ], 'user');
 - /*
 - [
 - {user: 'fabio', age: 34},
 - {user: 'klaus', age: 38},
 - {user: 'max', age: 29},
 - {user: 'robert', age: 28},
 - {user: 'zacarias', age: 44},
 - ]
 - */
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-partition)
- ``` sh
 - npm install just-partition
 - ```
 
- ``` sh
 - yarn add just-partition
 - ```
 
Elements satisfying predicate added to first array, remainder added to second
- ``` js
 - import partition from 'just-partition';
 - partition([1, 5, 2, 4, 3], n => n > 3); // [[5, 4],[1, 2, 3]]
 - partition(['a', 2, 3, '3'], x => typeof x == 'string'); // [['a', '3'],[2, 3]]
 - partition([1, 2, 3, 4], x => typeof x == 'number'); // [[1, 2, 3, 4],[]]
 - partition([1, 2, 3, 4], x => typeof x == 'string'); // [[], [1, 2, 3, 4]]
 - partition([], n => n > 3); // [[], []]
 - partition({a: 1, b: 2}, n => n > 1); // throws
 - partition(null, n => n > 1); // throws
 - partition(undefined, n => n > 1); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-permutations)
- ``` sh
 - npm install just-permutations
 - ```
 
- ``` sh
 - yarn add just-permutations
 - ```
 
Returns all permutations of the length N of the elements of the given Array
- ``` js
 - import permutations from 'just-array-permutations;
 - permutations([1, 2, 3]); // [[1, 2, 3], [2, 1, 3], [2, 3, 1], [1, 3, 2], [3, 1, 2], [3, 2, 1]]
 - permutations([]); // []
 - permutations(); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-range)
- ``` sh
 - npm install just-range
 - ```
 
- ``` sh
 - yarn add just-range
 - ```
 
Generate a range array for numbers
- ``` js
 - import range from 'just-range';
 - range(1, 5); // [1, 2, 3, 4]
 - range(5); // [0, 1, 2, 3, 4]
 - range(-5); // [0, -1, -2, -3, -4]
 - range(0, 20, 5) // [0, 5, 10, 15]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-remove)
- ``` sh
 - npm install just-remove
 - ```
 
- ``` sh
 - yarn add just-remove
 - ```
 
Removes one array from another
- ``` js
 - import remove from 'just-remove';
 - remove([1, 2, 3, 4, 5, 6], [1, 3, 6]); // [2, 4, 5]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-union)
- ``` sh
 - npm install just-union
 - ```
 
- ``` sh
 - yarn add just-union
 - ```
 
Returns the union of two arrays
- ``` js
 - import union from 'just-union';
 - union([1, 2, 5, 6], [2, 3, 4, 6]); // [1, 2, 5, 6, 3, 4]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-zip-it)
- ``` sh
 - npm install just-zip-it
 - ```
 
- ``` sh
 - yarn add just-zip-it
 - ```
 
Returns an array of grouped elements, taking n-th element from every given array
- ``` js
 - import zip from 'just-zip-it';
 - zip([1, 2, 3]); // [[1], [2], [3]]
 - zip([1, 2, 3], ['a', 'b', 'c']); // [[1, 'a'], [2, 'b'], [3, 'c']]
 - zip([1, 2], ['a', 'b'], [true, false]); //[[1, 'a', true], [2, 'b', false]]
 - zip(undefined, {}, false, 1, 'foo'); // []
 - zip([1, 2], ['a', 'b'], undefined, {}, false, 1, 'foo'); // [[1, 'a'], [2, 'b']]
 - zip([1, 2, 3], ['a', 'b'], [true]); // [[1, 'a', true], [2, 'b', undefined], [3, undefined, undefined]]
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-group-by)
- ``` sh
 - npm install just-group-by
 - ```
 
- ``` sh
 - yarn add just-group-by
 - ```
 
Return a grouped object from array
- ``` js
 - import groupBy from 'just-group-by';
 - groupBy([6.1, 4.2, 6.3], Math.floor); // { '4': [4.2], '6': [6.1, 6.3] }
 - groupBy([1,2,3,4,5,6,7,8], function(i) { return i % 2}); // { '0': [2, 4, 6, 8], '1': [1, 3, 5, 7] }
 - ```
 
Statistics
[🍦 Try it](https://anguscroll.com/just/just-mean)
- ``` sh
 - npm install just-mean
 - ```
 
- ``` sh
 - yarn add just-mean
 - ```
 
The mean (average) value in an array
- ``` js
 - import mean from 'just-mean';
 - mean([1, 2, 3, 2, 4, 1]); // 2.1666666667
 - mean(3, 2, 1); // 2
 - mean([4]); // 4
 - mean(['3', 2]); // throws
 - mean(); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-median)
- ``` sh
 - npm install just-median
 - ```
 
- ``` sh
 - yarn add just-median
 - ```
 
Return the median value of an array of numbers
- ``` js
 - import median from 'just-median';
 - median([1, 2, 3, 4, 5]); // 3
 - median([3, -1, 2]); // 2
 - median([9, 14, 14, 200, 15]); // 14
 - median(1, 2, 4, 3); // 2.5
 - median(['3', 2, 1]); // throws
 - median(); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-mode)
- ``` sh
 - npm install just-mode
 - ```
 
- ``` sh
 - yarn add just-mode
 - ```
 
Return the most frequently occuring number(s)
- ``` js
 - import mode from 'just-mode';
 - mode([1, 2, 3, 2]); // 2
 - mode(4, 4, 1, 4); // 4
 - mode(100, 100, 101, 101); // [100, 101]
 - mode(4, 3, 2, 1); // [1, 2, 3, 4]
 - mode(['1', 2, 2, 1, 2]); // throws
 - mode(null); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-percentile)
- ``` sh
 - npm install just-percentile
 - ```
 
- ``` sh
 - yarn add just-percentile
 - ```
 
Return the value at the given percentile (using linear interpolation)
- ``` js
 - import percentile from 'just-percentile';
 - percentile([1, 2, 3], 0); // 1
 - percentile([1, 2, 3], 0.5); // 2
 - percentile([1, 2, 3], 1); // 3
 - // See https://en.wikipedia.org/wiki/Percentile (linear interpolation method)
 - percentile([15, 20, 35, 40, 50], 0.05); // 15
 - percentile([15, 20, 35, 40, 50], 0.3); // 20
 - percentile([15, 20, 35, 40, 50], 0.4); // 27.5
 - percentile([15, 20, 35, 40, 50], 0.95); // 50
 - percentile(1, 2, 3, 50); // throws
 - percentile(['1', 2, 3], 50); // throws
 - percentile([], 50); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-variance)
- ``` sh
 - npm install just-variance
 - ```
 
- ``` sh
 - yarn add just-variance
 - ```
 
Return the standard deviation of an array or numeric argument list
- ``` js
 - import variance from 'just-variance';
 - variance([1, 2, 3, 2, 4, 1]); // 1.3666666667
 - variance(3, 2, 1); // 1
 - variance([100, 100, 100.1, 100]); // 0.0025
 - variance(1, 2, 3, 4, 5, -6); // 15.5
 - variance([4]); // throws
 - variance(['3', 2]); // throws
 - variance(NaN, NaN); // throws
 - variance(); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-standard-deviation)
- ``` sh
 - npm install just-standard-deviation
 - ```
 
- ``` sh
 - yarn add just-standard-deviation
 - ```
 
Return the standard deviation of an array or numeric argument list
- ``` js
 - import standardDeviation from "just-standard-deviation";
 - standardDeviation([1, 2, 3, 2, 4, 1]); // 1.16904519
 - standardDeviation(3, 2, 1); // 1
 - standardDeviation([100, 100, 100.1, 100]); // 0.05
 - standardDeviation(1, 2, 3, 4, 5, -6); // 3.9370039
 - standardDeviation([4]); // throws
 - standardDeviation(["3", 2]); // throws
 - standardDeviation(NaN, NaN); // throws
 - standardDeviation(); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-skewness)
- ``` sh
 - npm install just-skewness
 - ```
 
- ``` sh
 - yarn add just-skewness
 - ```
 
Return the skewness of an array or numeric argument list using Pearson's second skewness coefficient
- ``` js
 - import skewness from "just-skewness";
 - // Using Pearson's second skewness coefficient
 - skewness(3, 2, 1); // 0
 - skewness([1, 2, 3, 2, 4, 1]); // 0.4276994613841504
 - skewness(1, 2, 3, 4, 5, -6); // -0.762000762001143
 - skewness([1, 2, 3, 4, 9]); // 0.7705935588815224
 - skewness([4]); // throws
 - skewness(["3", 2]); // throws
 - skewness(NaN, NaN); // throws
 - skewness(); // throws
 - ```
 
Strings
[🍦 Try it](https://anguscroll.com/just/just-template)
- ``` sh
 - npm install just-template
 - ```
 
- ``` sh
 - yarn add just-template
 - ```
 
Interpolate a string with variables
- ``` js
 - import template from 'just-template';
 - var data = {
 - a: {
 - aa: {
 - aaa: 'apple',
 - bbb: 'pear'
 - },
 - bb: 'orange'
 - },
 - b: 'plum'
 - };
 - template('2 {{a.aa.aaa}}s, a {{a.aa.bbb}}, 3 {{a.bb}}s and a {{b}}. Yes 1 {{a.aa.bbb}}.', data);
 - // '2 apples, a pear, 3 oranges and a plum. Yes 1 pear.'
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-truncate)
- ``` sh
 - npm install just-truncate
 - ```
 
- ``` sh
 - yarn add just-truncate
 - ```
 
Truncate a string with a custom suffix
- ``` js
 - truncate('when shall we three meet again', 9); // 'when s...'
 - truncate('when shall we three meet again', 10, ' (etc)'); // 'when (etc)'
 - truncate('when shall we', 15,); // 'when shall we'
 - truncate('when shall we', 15, '(more)'); // 'when shall we'
 - truncate('when shall we', 10, ' (etc etc etc)'); // ' (etc etc etc)'
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-prune)
- ``` sh
 - npm install just-prune
 - ```
 
- ``` sh
 - yarn add just-prune
 - ```
 
Prune a string with whole words and a custom suffix
- ``` js
 - prune('when shall we three meet again', 7); // 'when...'
 - prune('when shall we three meet again', 7, ' (more)'; // 'when (more)'
 - prune('when shall we', 15,); // 'when shall we'
 - prune('when shall we', 15, ' (etc)'); // 'when shall we'
 - prune('when shall we', 7, ' (more)'); // ' (more)'
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-squash)
- ``` sh
 - npm install just-squash
 - ```
 
- ``` sh
 - yarn add just-squash
 - ```
 
Remove all spaces from a string, optionally remove escape sequences too
- ``` js
 - squash('the cat sat on the mat'); // 'thecatsatonthemat'
 - squash(' the cat sat on the mat '); // 'thecatsatonthemat'
 - squash('\tthe cat\n sat \fon \vthe \rmat '); // '\tthecat\nsat\fon\vthe\rmat'
 - squash('\tthe cat\n sat \fon \vthe \rmat ', true); // 'thecatsatonthemat'
 - squash(`the cat
 - sat on the mat`, true); // thecatsatonthemat
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-left-pad)
- ``` sh
 - npm install just-left-pad
 - ```
 
- ``` sh
 - yarn add just-left-pad
 - ```
 
Add characters to the left of a string such that its total length is n
- ``` js
 - import leftPad from 'just-left-pad';
 - leftPad('hello', 9); // ' hello'
 - leftPad('hello', 3); // 'hello'
 - leftPad('hello', 9, '.'); // '....hello'
 - leftPad('hello', 9, '..'); // '....hello'
 - leftPad('hello', 10, 'ab'); // 'bababhello'
 - leftPad('hello', 9, '\uD83D\uDC04'); // '🐄🐄🐄🐄hello'
 - leftPad('hello', 10, '\uD83D\uDC11\uD83D\uDC04'), // '🐄🐑🐄🐑🐄hello'
 - leftPad('hello', 7, '🐄'), // '🐄🐄hello'
 - leftPad(null, 7); // throws
 - leftPad([], 4, '*'); // throws
 - leftPad('hello', 4, true); // throws
 - leftPad('hello', -4, true); // throws
 - leftPad('hello', 2.3, true); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-right-pad)
- ``` sh
 - npm install just-right-pad
 - ```
 
- ``` sh
 - yarn add just-right-pad
 - ```
 
Add characters to the right of a string such that its total length is n
- ``` js
 - import rightPad from 'just-right-pad';
 - rightPad('hello', 9); // 'hello '
 - rightPad('hello', 3); // 'hello'
 - rightPad('hello', 9, '.'); // 'hello....'
 - rightPad('hello', 9, '..'); // 'hello....'
 - rightPad('hello', 10, 'ab'); // 'helloababa'
 - rightPad('hello', 9, '\uD83D\uDC04'); // 'hello🐄🐄🐄🐄'
 - rightPad('hello', 10, '\uD83D\uDC11\uD83D\uDC04'), // 'hello🐑🐄🐑🐄🐑'
 - rightPad('hello', 7, '🐄'), // 'hello🐄🐄'
 - rightPad(null, 7); // throws
 - rightPad([], 4, '*'); // throws
 - rightPad('hello', 4, true); // throws
 - rightPad('hello', -4, true); // throws
 - rightPad('hello', 2.3, true); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-camel-case)
- ``` sh
 - npm install just-camel-case
 - ```
 
- ``` sh
 - yarn add just-camel-case
 - ```
 
Convert a string to camel case
- ``` js
 - import camelCase from 'just-camel-case';
 - camelCase('the quick brown fox'); // 'theQuickBrownFox'
 - camelCase('the_quick_brown_fox'); // 'theQuickBrownFox'
 - camelCase('the-quick-brown-fox'); // 'theQuickBrownFox'
 - camelCase('theQuickBrownFox'); // 'theQuickBrownFox'
 - camelCase('thequickbrownfox'); // 'thequickbrownfox'
 - camelCase('the - quick * brown# fox'); // 'theQuickBrownFox'
 - camelCase('behold theQuickBrownFox'); // 'beholdTheQuickBrownFox'
 - camelCase('Behold theQuickBrownFox'); // 'beholdTheQuickBrownFox'
 - // all caps words are camel-cased
 - camelCase('The quick brown FOX'), 'theQuickBrownFox');
 - // all caps substrings >= 4 chars are camel-cased
 - camelCase('theQUickBrownFox'); // 'theQUickBrownFox'
 - camelCase('theQUIckBrownFox'); // 'theQUIckBrownFox'
 - camelCase('theQUICKBrownFox'); // 'theQuickBrownFox'
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-kebab-case)
- ``` sh
 - npm install just-kebab-case
 - ```
 
- ``` sh
 - yarn add just-kebab-case
 - ```
 
Convert a string to kebab case
- ``` js
 - import kebabCase from 'just-kebab-case';
 - kebabCase('the quick brown fox'); // 'the-quick-brown-fox'
 - kebabCase('the-quick-brown-fox'); // 'the-quick-brown-fox'
 - kebabCase('the_quick_brown_fox'); // 'the-quick-brown-fox'
 - kebabCase('theQuickBrownFox'); // 'the-quick-brown-fox'
 - kebabCase('theQuickBrown Fox'); // 'the-quick-brown-fox'
 - kebabCase('thequickbrownfox'); // 'thequickbrownfox'
 - kebabCase('the - quick * brown# fox'); // 'the-quick-brown-fox'
 - kebabCase('theQUICKBrownFox'); // 'the-q-u-i-c-k-brown-fox'
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-snake-case)
- ``` sh
 - npm install just-snake-case
 - ```
 
- ``` sh
 - yarn add just-snake-case
 - ```
 
Convert a string to snake case
- ``` js
 - import snakeCase from 'just-snake-case';
 - snakeCase('the quick brown fox'); // 'the_quick_brown_fox'
 - snakeCase('the-quick-brown-fox'); // 'the_quick_brown_fox'
 - snakeCase('the_quick_brown_fox'); // 'the_quick_brown_fox'
 - snakeCase('theQuickBrownFox'); // 'the_quick_brown_fox'
 - snakeCase('thequickbrownfox'); // 'thequickbrownfox'
 - snakeCase('the - quick * brown# fox'); // 'the_quick_brown_fox'
 - snakeCase('theQUICKBrownFox'); // 'the_q_u_i_c_k_brown_fox'
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-pascal-case)
- ``` sh
 - npm install just-pascal-case
 - ```
 
- ``` sh
 - yarn add just-pascal-case
 - ```
 
Convert a string to pascal case
- ``` js
 - import pascalCase from 'just-pascal-case';
 - pascalCase('the quick brown fox'); // 'TheQuickBrownFox'
 - pascalCase('the_quick_brown_fox'); // 'TheQuickBrownFox'
 - pascalCase('the-quick-brown-fox'); // 'TheQuickBrownFox'
 - pascalCase('theQuickBrownFox'); // 'TheQuickBrownFox'
 - pascalCase('thequickbrownfox'); // 'Thequickbrownfox'
 - pascalCase('the - quick * brown# fox'); // 'TheQuickBrownFox'
 - pascalCase('theQUICKBrownFox'); // 'TheQUICKBrownFox'
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-capitalize)
- ``` sh
 - npm install just-capitalize
 - ```
 
- ``` sh
 - yarn add just-capitalize
 - ```
 
Capitalize the first character of a string
- ``` js
 - import capitalize from 'just-capitalize';
 - /*
 - capitalize('capitals'); // 'Capitals'
 - capitalize('Capitals'); // 'Capitals'
 - capitalize('many words'); // 'Many words'
 - capitalize('!exclaim'); // '!exclaim'
 - */
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-replace-all)
- ``` sh
 - npm install just-replace-all
 - ```
 
- ``` sh
 - yarn add just-replace-all
 - ```
 
Replace all occurrences of a string within a string with another string
- ``` js
 - import replaceAll from 'just-replace-all';
 - /*
 - replaceAll('hello, world', 'l', 'q'); // 'heqqo, worqd'
 - replaceAll('hello, world', 'l', 'qq'); // 'heqqqqo, worqqd'
 - replaceAll('hello, world', 'll', 'q'); // 'heqo, world'
 - replaceAll('hello, world', '', 'q'); // 'hello, world'
 - replaceAll('hello, world', 'l', ''); // 'heo, word'
 - replaceAll('hello, world', null, 'q'); // 'hello, world'
 - replaceAll('hello, world', 'l'); // throw
 - replaceAll('hello, world'); // throw
 - replaceAll(); // throw
 - replaceAll(null, 'l', 'q'); // throw
 - replaceAll('hello, world', null, 'q'); // throw
 - replaceAll('hello, world', 'l', null); // throw
 - */
 - ```
 
Numbers
[🍦 Try it](https://anguscroll.com/just/just-clamp)
- ``` sh
 - npm install just-clamp
 - ```
 
- ``` sh
 - yarn add just-clamp
 - ```
 
Restrict a number within a range
- ``` js
 - import clamp from 'just-clamp';
 - var n = 5;
 - clamp(1, n, 12); // 5
 - clamp(3, n, 1); // 3
 - clamp(8, n, 9); // 8
 - clamp(0, n, 0); // 0
 - var n = -5;
 - clamp(1, n, 12); // 1
 - clamp(-7, n, -8); // -7
 - clamp(NaN, n, 8); // NaN
 - clamp(3, n, NaN); // NaN
 - clamp(3, NaN, 8); // NaN
 - clamp(undefined, n, 8); // throws
 - clamp(3, n, 'h'); // throws
 - clamp(3, false, 8); // throws
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-is-prime)
- ``` sh
 - npm install just-is-prime
 - ```
 
- ``` sh
 - yarn add just-is-prime
 - ```
 
Check if number is prime
- ``` js
 - import isPrime from 'just-is-prime;
 - /*
 - isPrime(1); // false
 - isPrime(2); // true
 - isPrime(17); // true
 - isPrime(10); // false
 - isPrime(); // throws
 - isPrime(null); // throws
 - isPrime("js"); // throws
 - isPrime({}); // throws
 - isPrime(function() {}); // throws
 - isPrime([]); // throws
 - */
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-modulo)
- ``` sh
 - npm install just-modulo
 - ```
 
- ``` sh
 - yarn add just-modulo
 - ```
 
Modulo of a number and a divisor
- ``` js
 - import modulo from 'just-modulo';
 - modulo(7, 5); // 2
 - modulo(17, 23); // 17
 - modulo(16.2, 3.8); // 1
 - modulo(5.8, 3.4); //2.4
 - modulo(4, 0); // 4
 - modulo(-7, 5); // 3
 - modulo(-2, 15); // 13
 - modulo(-5.8, 3.4); // 1
 - modulo(12, -1); // NaN
 - modulo(-3, -8); // NaN
 - modulo(12, 'apple'); // NaN
 - modulo('bee', 9); // NaN
 - modulo(null, undefined); // NaN
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-random-integer)
- ``` sh
 - npm install just-random-integer
 - ```
 
- ``` sh
 - yarn add just-random-integer
 - ```
 
Produces a random integer within a given range
- ``` js
 - import random from 'just-random-integer';
 - random();
 - // Returns either 0 or 1
 - random(5);
 - // Returns a random integer between 0 and 5 (inclusively)
 - random(3, 10);
 - // Returns a random integer between 3 and 10 (inclusively)
 - random(-5.8, 10.4);
 - // Returns a random integer between -5 and 10 (inclusively)
 - ```
 
Functions
[🍦 Try it](https://anguscroll.com/just/just-compose)
- ``` sh
 - npm install just-compose
 - ```
 
- ``` sh
 - yarn add just-compose
 - ```
 
Return a function composed of 2 or more functions
- ``` js
 - import compose from 'just-compose';
 - const sqRootBiggest = compose(Math.max, Math.sqrt, Math.trunc);
 - sqRootBiggest(10, 5); // 3
 - sqRootBiggest(7, 0, 16); // 4
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-curry-it)
- ``` sh
 - npm install just-curry-it
 - ```
 
- ``` sh
 - yarn add just-curry-it
 - ```
 
Return a curried function
- ``` js
 - import curry from 'just-curry-it';
 - function add(a, b, c) {
 - return a + b + c;
 - }
 - curry(add)(1)(2)(3); // 6
 - curry(add)(1)(2)(2); // 5
 - curry(add)(2)(4, 3); // 9
 - function add(...args) {
 - return args.reduce((sum, n) => sum + n, 0)
 - }
 - var curryAdd4 = curry(add, 4)
 - curryAdd4(1)(2, 3)(4); // 10
 - function converter(ratio, input) {
 - return (input*ratio).toFixed(1);
 - }
 - const curriedConverter = curry(converter)
 - const milesToKm = curriedConverter(1.62);
 - milesToKm(35); // 56.7
 - milesToKm(10); // 16.2
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-demethodize)
- ``` sh
 - npm install just-demethodize
 - ```
 
- ``` sh
 - yarn add just-demethodize
 - ```
 
Turn a method into a standalone function; the first arg becomes this
- ``` js
 - import demethodize from 'just-demethodize';
 - const trimFn = demethodize(''.trim);
 - ['hello ', ' goodbye', 'hello again'].map(trimFn); // ['hello', 'goodbye', 'hello again']
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-flip)
- ``` sh
 - npm install just-flip
 - ```
 
- ``` sh
 - yarn add just-flip
 - ```
 
Flip first two arguments of a function
- ``` js
 - import flip from 'just-flip';
 - flip(console.log)(1, 2, 3) // 2, 1, 3
 - import map from 'just-map-object';
 - import partial from 'just-partial';
 - const numbers = {x: 5, y: 10};
 - const flippedMap = flip(map);
 - const double = partial(flippedMap, (undefined, number) => number * 2);
 - double(numbers) // {x: 10, y: 20];
 - ```
 
[🍦 Try it](https://anguscroll.com/just/just-partial-it)
- ``` sh
 - npm install just-partial-it
 - ```
 
- ``` sh
 - yarn add just-partial-it
 - ```
 
Return a partial function
- ``` js
 
探客时代
