npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

attrpath

v0.5.6

Published

Attribute Path Traverser.

Downloads

207

Readme

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.

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

[email protected]

License

"AttrPath" is under MIT license.