0.2.51 • Published 3 months ago

js-upsert v0.2.51

Weekly downloads
-
License
MIT
Repository
github
Last release
3 months ago

js-upsert

js-upsert is a lightweight JavaScript library designed to simplify updating deeply nested properties within objects. It provides an intuitive and efficient way to manage complex object structures, ensuring non-destructive updates. This makes js-upsert a powerful tool for state management and other scenarios where precise modifications are necessary.


Features

  • Intuitive Syntax: Simplifies updates to deeply nested properties without a steep learning curve.
  • Non-destructive Updates: Preserves the original structure, updating only the targeted keys.
  • Lightweight: No dependencies, ensuring a small footprint.
  • Flexible API: Supports multiple ways to update properties, including functional updates.

Installation

Install js-upsert via npm or Yarn:

npm install js-upsert --save
yarn add js-upsert

Usage

Import the library:

import { upsert, set } from "js-upsert";

Core Functions

  1. upsert(haystack, ...needles?): Main function to perform updates on the target object (haystack) using specified needles.

  2. set(value, index?): Helper function to define how specific keys should be updated.

  3. at(...keys, value): Method for directly targeting a nested path within an object to update its value.


Examples

Sample Object

let user_data = {
  name: "John Doe",
  age: 22,
  login_data: {
    data: [
      { time: "08:55 PM", date: "28-03-2024" },
      { time: "10:55 PM", date: "28-03-2024" },
    ],
    token: "13A131Q334",
  },
};

Example 1: Updating a Key Using set

Update user_data.login_data.token to "MY NEW VALUE":

const updated = upsert(user_data, {
  login_data: {
    token: set("MY NEW VALUE"),
  },
});
console.log(updated);

Output:

{
  name: "John Doe",
  age: 22,
  login_data: {
    data: [
      { time: "08:55 PM", date: "28-03-2024" },
      { time: "10:55 PM", date: "28-03-2024" },
    ],
    token: "MY NEW VALUE",
  },
}

Explanation:
The set function specifies the value to update for a given key. This ensures non-destructive updates to the object.


Example 2: Updating Using at

Update user_data.login_data.data[1].time to "11:00 PM":

const updated = upsert(user_data).at(
  "login_data",
  "data",
  1,
  "time",
  "11:00 PM"
);
console.log(updated);

Output:

{
  name: "John Doe",
  age: 22,
  login_data: {
    data: [
      { time: "08:55 PM", date: "28-03-2024" },
      { time: "11:00 PM", date: "28-03-2024" },
    ],
    token: "13A131Q334",
  },
}

Explanation:
at allows you to directly specify a nested path (keys) and a new value to update.


Example 3: Functional Updates

Update user_data.login_data.data[1].time with a Function:

const updated = upsert(user_data).at("login_data", "data", 1, (prev) => ({
  ...prev,
  time: "12:00 PM",
}));
console.log(updated);

Output:

{
  name: "John Doe",
  age: 22,
  login_data: {
    data: [
      { time: "08:55 PM", date: "28-03-2024" },
      { time: "12:00 PM", date: "28-03-2024" },
    ],
    token: "13A131Q334",
  },
}

Explanation:
You can pass a function to dynamically compute the updated value based on the previous value.


API Reference

upsert(haystack, ...needles?)

  • Parameters:
    • haystack: The target object to update.
    • needles: Key-value pairs defining the properties to update.
  • Returns: A new object with the updated structure.

set(value, index?)

  • Parameters:

    • value: The new value to set.
    • index (optional): An array to specify which elements in an array to update.
  • Returns: An object describing the update operation.


at(...keys, value)

  • Parameters:

    • keys: An array of strings or numbers defining the path to the target key.
    • value: The new value to set, or a function to compute the value dynamically.
  • Returns: A new object with the updated structure.


Notes

  • Use upsert for broader updates across multiple keys.
  • Use at for precise updates to a single path.
0.2.4362

7 months ago

0.2.41

7 months ago

0.2.4361

7 months ago

0.2.4364

7 months ago

0.2.4363

7 months ago

0.2.4366

4 months ago

0.2.4365

7 months ago

0.2.43

7 months ago

0.2.42

7 months ago

0.2.51

3 months ago

0.2.436

7 months ago

0.2.435

7 months ago

0.2.434

7 months ago

0.2.433

7 months ago

0.2.432

7 months ago

0.2.431

7 months ago

0.2.5

3 months ago

0.2.4

7 months ago

0.2.32

1 year ago

0.2.31

1 year ago

0.2.3

1 year ago

0.2.241

1 year ago

0.2.24

1 year ago

0.2.23

1 year ago

0.2.22

1 year ago

0.2.21

1 year ago

0.1.91

1 year ago

0.2.1

1 year ago

0.2.0

1 year ago

0.2.2

1 year ago

0.1.9

1 year ago

0.1.7

1 year ago

0.1.4

1 year ago

0.1.71

1 year ago

0.1.72

1 year ago

0.1.6

1 year ago

0.1.5

1 year ago

0.1.3

1 year ago

0.1.1

1 year ago

0.1.0

1 year ago

0.0.1

1 year ago