UNPKG

js-upsert

Version:

`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`

208 lines (148 loc) 4.27 kB
# 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: ```bash npm install js-upsert --save ``` ```bash yarn add js-upsert ``` --- ## Usage Import the library: ```javascript 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 ```javascript 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"`: ```javascript const updated = upsert(user_data, { login_data: { token: set("MY NEW VALUE"), }, }); console.log(updated); ``` #### Output: ```javascript { 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"`: ```javascript const updated = upsert(user_data).at( "login_data", "data", 1, "time", "11:00 PM" ); console.log(updated); ``` #### Output: ```javascript { 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: ```javascript const updated = upsert(user_data).at("login_data", "data", 1, (prev) => ({ ...prev, time: "12:00 PM", })); console.log(updated); ``` #### Output: ```javascript { 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.