Skip to content
This repository has been archived by the owner on Dec 19, 2023. It is now read-only.
/ deep Public archive
forked from blakek/deep

๐Ÿก Get, set, remove, and test for deeply nested properties

License

Notifications You must be signed in to change notification settings

418sec/deep

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

31 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

deep

๐Ÿก Get, set, remove, and test for deeply nested properties

Helps you safely work with nested properties.

Note: set() and remove() modify the passed-in object rather than creating a copy. If you'd rather return a new object each time, there are several other solutions (unchanged is really good).

Install

Using Yarn:

$ yarn add @blakek/deep

โ€ฆor using npm:

$ npm i --save @blakek/deep

Usage

import { get, getOr, has, pluck remove, set } from '@blakek/deep';

const user = {
  id: 'abf87de',
  roles: ['alert:create', 'alert:read'],
  sites: {
    github: {
      username: 'blakek'
    }
  }
};

// Get a property value
get('sites.github.username', user); //ยป 'blakek'

// Arguments can be partially applied
const githubUsername = get('sites.github.username');
githubUsername(user); //ยป 'blakek'

// Get a property value with a fallback other than `undefined`
getOr('no-account', 'sites.facebook.username', user); //ยป 'no-account'

// Test for a property value
has('sites.github', user); //ยป true

// Pluck a subset of properties
pluck(['id', 'roles'], user);
//ยป { id: 'abf87de', roles: [ 'alert:create', 'alert:read' ] }

// Remove a property value
remove('a', { a: 42, b: 123 }); //ยป { b: 123 }

// Set a property value
set(123, 'a.b.c', { a: 42 }); //ยป { a: { b: { c: 123 } } }

API

For all these:

  • path can be either a dot-notation string or array of path parts
  • arguments can be partially applied

get

function get(path: Path, object: any): any;

Gets the value for a given path with an optional fallback value.

const user = {
  id: 'abf87de',
  roles: ['alert:create', 'alert:read'],
  sites: {
    github: {
      username: 'blakek'
    }
  }
};

get('id', user); //ยป 'abf87de'
get('roles.0', user); //ยป 'alert:create'
get('roles[0]', user); //ยป 'alert:create'
get(['roles', 1], user); //ยป 'alert:read'
get('sites.github.username', user); //ยป 'blakek'

const getID = get('id');
getID(user); //ยป 'abf87de'

getOr

function getOr(defaultValue: any, path: Path, object: any): any;

Like get, gets a value from an object. Will return a fallback other than undefined if the value was not found equal to undefined.

const user = {
  id: 'abf87de',
  roles: ['alert:create', 'alert:read'],
  sites: {
    github: {
      username: 'blakek'
    }
  }
};

getOr('/images/placeholder.png', 'sites.github.image', user); //ยป '/images/placeholder.png'

const getRoles = getOr([], 'roles');
getRoles(user); //ยป ['alert:create', 'alert:read']
getRoles({}); //ยป []

has

function has(path: Path, object: any): boolean;

Returns true if a value was found at the given path or false if nothing was found.

const product = {
  id: 'abf87de',
  name: 'Logo T-Shirt',
  attributes: {
    isCool: undefined,
    materials: ['cotton']
  }
};

has('attributes.materials', product); //ยป true
has(['avability', 'sizes'], product); //ยป false
has('attributes.isCool', product); //ยป true; property exists but is undefined

// `get()` should be used if you want to ensure a value is not `undefined`
getOr(false, 'attributes.isCool', product); //ยป false

remove

function remove(path: Path, object: any): any;

Removes a value at a path and returns the object.

const user = {
  username: 'blakek',
  password: 'wouldntyouliketoknow'
};

remove('password', user); //ยป { username: 'blakek' }
remove('property.does.not.exist', user);
//ยป { username: 'blakek' } (same object from previous line)

pluck

function pluck(properties: Path[], object: any): any;

Gets a subset of properties from an object.

const user = {
  username: 'blakek',
  roles: ['alert:create', 'alert:read'],
  sites: {
    github: {
      username: 'blakek'
    }
  }
};

pluck(['username'], user); //ยป { username: 'blakek' }
pluck(['username', 'roles'], user);
//ยป { username: 'blakek', roles: [ 'alert:create', 'alert:read' ] }

set

function set(value: any, path: Path, object: any): any;

Sets a value at a path and returns the object.

const user = {
  profile: {
    bgColor: '#639'
  }
};

set('tomato', 'profile.bgColor', user); //ยป { profile: { bgColor: 'tomato' } }

set('/images/user.png', 'profile.bgImage', user);
//ยป { profile: { bgColor: 'tomato', bgImage: '/images/user.png' } }

const logout = set(null, 'profile');
logout(user); //ยป { profile: null }

Contributing

Node.js and Yarn are required to work with this project.

To install all dependencies, run:

yarn

Useful Commands

yarn build Builds the project to ./dist
yarn format Format the source following the Prettier styles
yarn test Run project tests
yarn test --watch Run project tests, watching for file changes

License

MIT

About

๐Ÿก Get, set, remove, and test for deeply nested properties

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript 71.8%
  • JavaScript 28.2%