JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 15
  • Score
    100M100P100Q50783F
  • License MIT

Attribute Path Traverser.

Package Exports

    This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (attrpath) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

    Readme

    AttrPath

    Object Attribute Path Traverser. Safely traverse the javascript attribute tree using a text path representation. You can also check the existence of the path.

    GitHub package.json version npm version npm type definitions GitHub 7thCode node.js.yml GitHub last commit

    README DEMO in detail


    Motivation

    For example, I didn't like to write the following code every time... humm...

    const value = {
        children: {
            john: {hobby: [{name: "Cycling"}, {name: "Dance"}], pet: [{type: "dog", name: "Max"}]},
            tom: {hobby: [{name: "Squash"}], pet: [{type: "cat", name: "Chloe"}]}
        }
    };
    
    var answer = undefined;
    if (value.children) {
        if (value.children.john) {
            if (value.children.john.hobby) {
                if (Array.isArray(value.children.john.hobby)) {
                    if (value.children.john.hobby.length >= 2) {
                        if (value.children.john.hobby[1].name) {
                            answer = value.children.john.hobby[1].name;
                        }
                    }
                }
            }
        }
    }
    
    or
    
    answer = value?.children?.john?.hobby[1]?.name;
    

    The ugly thing above is nice if you can write it like this, right?

    const {AttrPath}: any = require("attrpath");
    
    var answer = AttrPath.traverse(value, ".children.john.hobby[1].name");

    Features

    Safely traverse the object path using the given path string. Also, an array may be included in the middle of the path.


    Installation

    npm install atttrpath

    No modules depend on it.


    Usage

    Import

    const {AttrPath}: any = require("attrpath");
    // or
    import {AttrPath} from 'attrpath';

    traverse value.

    result = AttrPath.traverse(object, path [default_value]);

    params

    params meaning
    object: any Target Object.
    path: string Traverse path. The beginning of the path is "." or "[".
    e.g. ".cat.eye.left", ".dog['leg'][1].pad" , etc...
    default_value: any The value to return if there is no corresponding value in the object path. default is "undefined".
    default_value: function If you give a function, give the traverse result to the first argument of the function.

    result

    result meaning
    result: any Objects obtained as a result of traverse.

    Update the value if possible.

    result = AttrPath.update(object, path , value);

    params

    params meaning
    object: any Target Object.
    path: string Traverse path. The beginning of the path is "." or "[".
    e.g. ".cat.eye.left", ".dog['leg'][1].pad" , etc...
    value: any The value to update if the path exists.

    result

    result meaning
    result: boolean Has an update.

    path is grammatically valid?

    result = AttrPath.is_valid(path);

    params

    params meaning
    path: string Traverse path.

    result

    result meaning
    result: boolean path is grammatically correct?

    Default Value

    If the result is Undefined, the default value is returned.

    const {AttrPath} = require('attrpath');
    
        AttrPath.traverse({}, '.path', 1);

    Example

    const {AttrPath}: any = require("attrpath");
    
    const value = {
        children: {
            john: {
                hobby: [{name: "Cycling"}, {name: "Dance"}],
                pet: [{type: "dog", name: "Max"}]
            },
            tom: {
                hobby: [{name: "Squash"}],
                pet: [{type: "cat", name: "Chloe"}]
            }
        }
    };
    
    console.log(AttrPath.traverse(value, '.children.john.hobby[0].name'))
    
    > "Max"
    
    console.log(AttrPath.traverse(value, '.children.john.hobby[1].name'))
    
    > undefined
    
    
    const Default = (n:any) => {
        console.log(n);
    }
    
    AttrPath.traverse(value, '.children.john.hobby[0].name', Default)
    
    > "Max"
    
    console.log(AttrPath.is_valid('.children.john.hobby[0].name'))
    
    > true
    
    console.log(AttrPath.is_valid('.children.john.hobby[0]..name'))
    
    > false

    more Example

    class Klass {
        member = "name";
    
        Member() {
            return AttrPath.traverse(this, '.member');
        }
    }
    
    const klass = new Klass();
    console.log(klass.Member())
    
    > "name"
    class ParentKlass {
        member = "name";
    }
    
    class SubKlass extends ParentKlass {
        Member() {
            return AttrPath.traverse(this, '.member');
        }
    }
    
    const sub_klass = new SubKlass();
    console.log(sub_klass.Member())
    
    > "name"

    Example Data

        const value = {
            children: {
                john: {
                    hobby: [{name: "Cycling"}, {name: "Dance"}],
                    pet: [{type: "dog", name: "Max"}]
                },
                tom: {
                    hobby: [{name: "Squash"}],
                    pet: [{type: "cat", name: "Chloe"}]
                }
            }
        };

    ESModule

    import {AttrPath} from 'attrpath';
    
        AttrPath.traverse(value, '.children')
        AttrPath.is_valid('.children["john"].hobby[1].name')

    CommonJS

    const {AttrPath} = require('attrpath');
    
        AttrPath.traverse(value, '.children');
        AttrPath.is_valid('.children["john"].hobby[1].name')

    Array

    The original value can be an array.

    const {AttrPath} = require('attrpath');
    
        AttrPath.traverse([1], '[0]');

    Undefined

    Returns Undefined if the original value is not an object.

    const {AttrPath} = require('attrpath');
    
        AttrPath.traverse(null, '.path');
        AttrPath.traverse(undefined, '.path');
        AttrPath.traverse(false, '.path');
        AttrPath.traverse(true, '.path');
        AttrPath.traverse(NaN, '.path');
        AttrPath.traverse(Infinity, '.path');
        AttrPath.traverse(0, '.path');
        AttrPath.traverse(-1, '.path');
        AttrPath.traverse("", '.path');
        AttrPath.traverse("1", '.path');
        AttrPath.traverse([1], '.path');
        AttrPath.traverse({}, '.path');

    Tips

    Note that the result object is just the argument object, so mutating the result object has the side effect of modifying the argument object. This side effect can actually be useful. js const before = [{name: "Dance"}]; AttrPath.traverse(before, '[0]').name = "Breaking"; console.log(before); [{name: "Breaking"}]

    Hostory

    v0.5.5

    update Method.

    update Method impl.

    v0.5.2

    Bug Fix

    Fixed to work correctly when the key contains ".".

        const value = {
            "children.john": {
                    hobby: [{name: "Cycling"}, {name: "Dance"}],
                    pet: [{type: "dog", name: "Max"}]
                }
        };
    
        AttrPath.traverse(value, "['children.john']");

    Note

    The results of using objects, arrays, and symbols as keys are unknown.

    See demo.md for unclear cases.

    Author

    info@seventh-code.com

    License

    "AttrPath" is under MIT license.