Skip to content

team-griffin/capra

Repository files navigation

@team-griffin/capra

We can do a lot of cool stuff with the latest ES spec. Rest/spread, Object.entries, etc. For 90% of what lodash/underscore/ramda provides you can easily accomplish with native javascript now. Capra's aim is just to cover some of the more awkward computations that aren't out-of-the-box yet.

These methods are written for post-IE browsers so they're very small and very performant.

map-obj

(obj: object, fn: (key: strng, value: any) => [ string, any ]): object

Calls fn with each key/value of obj. Expects a tuple of newKey/newValue in order to construct the return object.

before

Object
  .entries(obj)
  .reduce((acc, [ key, value ]) => {
    const [ newKey, newValue ] = fn(key, value);
    return {
      ...acc,
      [newKey]: newValue,
    };
  }, {});

after

mapObj(obj, fn);

filter-obj

(obj: object, fn: (key: string, value: any) => boolean): object

Filters out object properties based on the predecate function.

before

Object
  .entries(obj)
  .reduce((acc, [ key, value ]) => {
    if (fn(key, value)) {
      return {
        ...acc,
        [key]: value,
      };
    } else {
      return acc;
    }
  })

after

filterObj(obj, fn);

invert-obj

(obj: object): object

Inverts the key/value pairs of an object.

before

Object
  .entries(obj)
  .reduce((acc, [ key, value ]) => {
    return {
      ...acc,
      [value]: key,
    };
  }, {});

after

invertObj(obj);

omit

(obj: object, keys: string[]): object

Omits the given keys from an object.

before

const {
  foo,
  bah,
  ...withoutFooBah,
} = obj;

after

const withoutFooBah = omit(obj, [ 'foo', 'bah' ]);

assoc-path

(obj: object, path: string[], value: any): object

Adds a property at a deeply-nested level. This was an ugly mess of spread properties and was hard to do dynamically...

before

{
  ...obj,
  foo: {
    ...obj?.foo,
    bah: {
      ...obj?.foo?.bah,
      baz: 'baz',
    },
  },
}

after

assocPath(obj, [ 'foo', 'bah', 'baz' ], 'baz');

group-by

(arr: any[], fn: (v: any) => string): object

Groups an array based on the given predecate

before

not really possible with native methods

after

groupBy(arr, (x) => x.category);

is-empty

(a: any): boolean

is-nil-or-empty

(a: any): boolean