Utility for immutable object updates.
Clone or download
Latest commit 6e3add7 Nov 14, 2017
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib Build. Nov 13, 2017
src purgeArray returns always undefined Nov 1, 2017
test Add support for Object.create(null). Oct 31, 2017
.babelrc First commit. Oct 11, 2017
.editorconfig First commit. Oct 11, 2017
.eslintrc Refactoring and tests. Oct 12, 2017
.gitignore Initial commit Oct 9, 2017
.travis.yml Add .travis.yml Oct 22, 2017
LICENSE Initial commit Oct 9, 2017
README.md Minor README corretions. Nov 13, 2017
package-lock.json 1.2.1 Nov 13, 2017
package.json 1.2.1 Nov 13, 2017

README.md

Build Status

update

Utility for immutable updates with simple API and with good amount of features to make it useful across different projects.

Installation

npm install @blazingedge/update --save

Usage

import update from '@blazingedge/update'

const newState = update(state, 'path.to.users[7]', {
  email: 'some.email@example.com',
  balance: {
    amount: n => n + 100
  }
})

More examples in the article.

API

update(data, [path], change)

Arguments

  • data (any): The data to update.
  • [path] (Array | string): The path of the property to update.
  • change (any): The change to apply.
    • if a function then it's used to compute the new value from current one,
    • if a plain object then each its value is the change for respective key/index,
    • otherwise it's the new value.

Returns

Returns updated data. When no effective changes are made, returns the same data.

REMOVE

Special value to use in a change to remove part(s) of data.

import update, { REMOVE } from '@blazingedge/update'

// Remove entire player
update(state, 'path.to.playersById[7]', REMOVE)

// Removing and setting
update(state, 'path.to.playersById', {
  [killedPlayerId]: REMOVE,
  [killedBy]: {
    kills: n => n + 1,
  }
})

Path with "*"

To apply a change to all values of an array/object, we can use "*".

update(state, 'path.to.users[*].balance.amount', n => n + 100)

update(state, 'path.to.users[*]', (user) => {
  if (Math.random() < 0.8) {
    return REMOVE
  }
  // Mark others as lucky and double the balance amount
  return update(user, {
    lucky: true,
    balance: {
      amount: n => n * 2
    }
  })
})

Path as Array

When path is passed as an array, it can also contain "filters" to selectively change multiple values of an array/object.

update(state, ['path', 'to', 'users', { lucky: true }, 'balance'], {
  limit: REMOVE,
  amount: n => n + 1000
})

A filter can be a:

  • function: user => user.lucky,
  • plain object with required values: { lucky: true } (use {} for "all"),
  • array of indexes/keys: [2, 4, 6, 8]