https://github.com/beizhedenglong/js-lens
Safely accessing and updating nested object with functional features.
https://github.com/beizhedenglong/js-lens
accessing compose immutable nested-objects ramda set
Last synced: about 1 year ago
JSON representation
Safely accessing and updating nested object with functional features.
- Host: GitHub
- URL: https://github.com/beizhedenglong/js-lens
- Owner: beizhedenglong
- License: mit
- Created: 2018-10-07T09:12:34.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2019-05-03T05:01:28.000Z (about 7 years ago)
- Last Synced: 2025-03-28T04:41:49.777Z (about 1 year ago)
- Topics: accessing, compose, immutable, nested-objects, ramda, set
- Language: TypeScript
- Homepage:
- Size: 1.67 MB
- Stars: 3
- Watchers: 2
- Forks: 1
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Js Lens
[](https://travis-ci.org/beizhedenglong/js-lens)
[](https://coveralls.io/github/beizhedenglong/js-lens?branch=master)
[](https://greenkeeper.io/)
[](https://david-dm.org/beizhedenglong/js-lens?type=dev)
Js Lens is a tiny library that help you accessing and updating deep nested object safely with functional features(immutability and composition).
Accessing and updating nested object directly in JavaScript maybe dangerous. Like this:
```js
let nestedObj = {
user: {
name: 'Victor',
favoriteColors: ["black", "white", "grey"],
// contact info doesn't appear here
// contact: {
// phone: 123,
// email: "123@example.com"
// }
}
}
// if we want to get the user's phone number, we will get an TypeError: Cannot read property 'phone' of undefined
const phoneNumber = nestedObj.user.contact.phone
// How about set the phone number?
nestedObj.user.contact.phone = 123 // we also got an TypeError: Cannot set property 'phone' of undefined
```
With Js Lens, we can get rid of this risk.
## Installation
`npm install js-lens --save`
## Accessing And Updating
```js
import { lensPath, view, set, over } from "js-lens"
const contactPhoneLens = lensPath(["user", "contact", "phone"])
const colorsLens = lensPath(["user", "favoriteColors"])
// get phone number
view(contactPhoneLens, nestedObj) // undefined
// set phone number
let newNestedObj = set(contactPhoneLens, 123, nestedObj) // return a new object, leaving original object untouched.
view(contactPhoneLens, newNestedObj) // 123
// update value base on previous value by using over
newNestedObj = over(colorsLens, colors => [...colors, "brown"], nestedObj)
view(colorsLens, newNestedObj) // [ 'black', 'white', 'grey', 'brown' ]
```
## Lens Can Compose
```js
import { lensPath, view, set, lensCompose } from "js-lens"
const contactLens = lensPath(["user", "contact"])
const emailLens = lensPath(["email"])
const addressLens = lensPath(["addressLens"])
const contactAddressLens = lensCompose(contactLens, addressLens)
const contactEmailLens = lensCompose(contactLens, emailLens)
// get address
view(contactAddressLens, newNestedObj) // undefined
// set address
newNestedObj = set(contactAddressLens, "Mars", newNestedObj)
view(contactAddressLens, newNestedObj) // Mars
// set email
newNestedObj = set(contactEmailLens, "hello@example.com", newNestedObj)
view(contactEmailLens, newNestedObj) // hello@example.com
```
TODO API DOC