• Stars
    star
    1,037
  • Rank 42,771 (Top 0.9 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 10 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A tiny JavaScript utility to access deep properties using a path (for Node and the Browser)

object-path

Access deep properties using a path

NPM version Build Status Coverage Status devDependency Status Downloads

Changelog

0.11.8

  • SECURITY FIX. Fix a prototype pollution vulnerability in the del(), empty(), push(), insert() functions when using the "inherited props" mode (e.g. when a new object-path instance is created with the includeInheritedProps option set to true or when using the withInheritedProps default instance. To help with preventing this type of vulnerability in the client code, also the get() function will now throw an exception if an object's magic properties are accessed. The vulnerability does not exist in the default instance exposed by object path (e.g objectPath.del()) if using version >= 0.11.0.

0.11.6

  • SECURITY FIX. Fix a circumvention of the security fix released in 0.11.5 when non-string/non-numeric values are used in the path (e.g. op.withInheritedProps.set({}, [['__proto__'], 'polluted'], true))

0.11.5

  • SECURITY FIX. Fix a prototype pollution vulnerability in the set() function when using the "inherited props" mode (e.g. when a new object-path instance is created with the includeInheritedProps option set to true or when using the withInheritedProps default instance. The vulnerability does not exist in the default instance exposed by object path (e.g objectPath.set()) if using version >= 0.11.0.

0.11.0

  • Introduce ability to specify options and create new instances of object-path
  • Introduce option to control the way object-path deals with inherited properties (includeInheritedProps)
  • New default object-path instance already configured to handle not-own object properties (withInheritedProps)

0.10.0

  • Improved performance of get, set, and push by 2x-3x
  • Introduced a benchmarking test suite
  • BREAKING CHANGE: del, empty, set will not affect not-own object's properties (made them consistent with the other methods)

Install

Node.js

npm install object-path --save

Bower

bower install object-path --save

Typescript typings

typings install --save dt~object-path

Usage

var obj = {
  a: {
    b: "d",
    c: ["e", "f"],
    '\u1200': 'unicode key',
    'dot.dot': 'key'
  }
};

var objectPath = require("object-path");

//get deep property
objectPath.get(obj, "a.b");  //returns "d"
objectPath.get(obj, ["a", "dot.dot"]);  //returns "key"
objectPath.get(obj, 'a.\u1200');  //returns "unicode key"

//get the first non-undefined value
objectPath.coalesce(obj, ['a.z', 'a.d', ['a','b']], 'default');

//empty a given path (but do not delete it) depending on their type,so it retains reference to objects and arrays.
//functions that are not inherited from prototype are set to null.
//object instances are considered objects and just own property names are deleted
objectPath.empty(obj, 'a.b'); // obj.a.b is now ''
objectPath.empty(obj, 'a.c'); // obj.a.c is now []
objectPath.empty(obj, 'a'); // obj.a is now {}

//works also with arrays
objectPath.get(obj, "a.c.1");  //returns "f"
objectPath.get(obj, ["a","c","1"]);  //returns "f"

//can return a default value with get
objectPath.get(obj, ["a.c.b"], "DEFAULT");  //returns "DEFAULT", since a.c.b path doesn't exists, if omitted, returns undefined

//set
objectPath.set(obj, "a.h", "m"); // or objectPath.set(obj, ["a","h"], "m");
objectPath.get(obj, "a.h");  //returns "m"

//set will create intermediate object/arrays
objectPath.set(obj, "a.j.0.f", "m");

//will insert values in array
objectPath.insert(obj, "a.c", "m", 1); // obj.a.c = ["e", "m", "f"]

//push into arrays (and create intermediate objects/arrays)
objectPath.push(obj, "a.k", "o");

//ensure a path exists (if it doesn't, set the default value you provide)
objectPath.ensureExists(obj, "a.k.1", "DEFAULT");
var oldVal = objectPath.ensureExists(obj, "a.b", "DEFAULT"); // oldval === "d"

//deletes a path
objectPath.del(obj, "a.b"); // obj.a.b is now undefined
objectPath.del(obj, ["a","c",0]); // obj.a.c is now ['f']

//tests path existence
objectPath.has(obj, "a.b"); // true
objectPath.has(obj, ["a","d"]); // false

//bind object
var model = objectPath({
  a: {
    b: "d",
    c: ["e", "f"]
  }
});

//now any method from above is supported directly w/o passing an object
model.get("a.b");  //returns "d"
model.get(["a.c.b"], "DEFAULT");  //returns "DEFAULT"
model.del("a.b"); // obj.a.b is now undefined
model.has("a.b"); // false

How object-path deals with inherited properties

By default object-path will only access an object's own properties. Look at the following example:

var proto = {
  notOwn: {prop: 'a'}
}
var obj = Object.create(proto);

//This will return undefined (or the default value you specified), because notOwn is
//an inherited property
objectPath.get(obj, 'notOwn.prop');

//This will set the property on the obj instance and not the prototype.
//In other words proto.notOwn.prop === 'a' and obj.notOwn.prop === 'b'
objectPath.set(obj, 'notOwn.prop', 'b');

To configure object-path to also deal with inherited properties, you need to create a new instance and specify the includeInheritedProps = true in the options object:

var objectPath = require("object-path");
var objectPathWithInheritedProps = objectPath.create({includeInheritedProps: true})

Alternatively, object-path exposes an instance already configured to handle inherited properties (objectPath.withInheritedProps):

var objectPath = require("object-path");
var objectPathWithInheritedProps = objectPath.withInheritedProps

Once you have the new instance, you can access inherited properties as you access other properties:

var proto = {
  notOwn: {prop: 'a'}
}
var obj = Object.create(proto);

//This will return 'a'
objectPath.withInheritedProps.get(obj, 'notOwn.prop');

//This will set proto.notOwn.prop to 'b'
objectPath.set(obj, 'notOwn.prop', 'b');

NOTE: For security reasons object-path will throw an exception when trying to access an object's magic properties (e.g. __proto__, constructor) when in "inherited props" mode.

Immutability

If you are looking for an immutable alternative of this library, you can take a look at: object-path-immutable

Credits

More Repositories

1

object-path-immutable

Modify deep object properties without modifying the original object (immutability). Works great with React and Redux.
JavaScript
407
star
2

scatter

IoC container and out-of-the-box extensibility for Node.js applications
JavaScript
156
star
3

gulp-concat-css

Concatenates css files, bubbling up import statements (as per the standard), and optionally rebasing urls and inlining local import statements.
JavaScript
76
star
4

npm-workspace

A command line utility to ease the `link`-ing of local npm modules
JavaScript
59
star
5

gulp-clone

Clone files in memory in a gulp stream
JavaScript
39
star
6

variations-stream

Streams all the variations (with repetitions) of a set
JavaScript
11
star
7

level-indico

Simple indexing and querying for leveldb
JavaScript
9
star
8

through2-parallel

Parallel Transform stream with an interface lifted from through2
JavaScript
7
star
9

linkemon

Tiny wrapper script around nodemon that will automatically watch all linked modules
Shell
7
star
10

angular-extender

Extend AngularJS applications by injecting module dependencies at build time
JavaScript
6
star
11

gulp-angular-extender

Extend AngularJS applications by injecting module dependencies at build time
JavaScript
5
star
12

minimodel

Minimal, database agnostic Models for Node.js (and the Browser)
JavaScript
4
star
13

benchpress

No fuss benchmarking for Node.js
JavaScript
4
star
14

gulp-multinject

Inject scripts, stylesheets and more into templates and htmls, with support for namespaces
JavaScript
3
star
15

git-workspace

CLI util to keep multiple projects in sync with different remote git repos
JavaScript
3
star
16

spawned

Smart wrapper around child_process.spawn using promises
JavaScript
2
star
17

multistream-merge

Merge multiple streams into one, using Streams2.
JavaScript
2
star
18

powerset-stream

Streams all the possible combinations of subsets of the set given in input
JavaScript
1
star
19

delega

Concise creation of delegated methods for your classes/objects
JavaScript
1
star