Giter Club home page Giter Club logo

js-lens's Introduction

Js Lens

Build Status Coverage Status Greenkeeper badge Dev Dependencies

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:

let nestedObj = {
  user: {
    name: 'Victor',
    favoriteColors: ["black", "white", "grey"],
    // contact info doesn't appear here
    // contact: {
    //   phone: 123,
    //   email: "[email protected]"
    // }
  }
}

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

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

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, "[email protected]", newNestedObj)
view(contactEmailLens, newNestedObj) // [email protected]
  

TODO API DOC

js-lens's People

Contributors

beizhedenglong avatar greenkeeper[bot] avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.