JSPM

  • Created
  • Published
  • Downloads 34326
  • Score
    100M100P100Q137216F
  • License MIT

Find Keys using Wildcard matching and optional value function.

Package Exports

  • object-scan

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 (object-scan) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Object-Scan

Build Status Test Coverage Dependabot Status Dependencies NPM Downloads Semantic-Release Gardener Gitter

Find Keys using Wildcard matching and optional value function.

Install

Install with npm:

$ npm install --save object-scan

Usage

const objectScan = require('object-scan');

objectScan(["a.*.f"])({ a: { b: { c: 'd' }, e: { f: 'g' } } });
// => [ 'a.e.f' ]

Features

  • Object and array matching with e.g. key.path and [1]
  • Key and index wildcard matching with * and [*]
  • Partial key and index wildcard matching, e.g. mark* or [1*]
  • Infinite nested matches with **
  • Simple or-clause for key and index with {a,b} and [{0,1}]
  • Full support for escaping
  • Lots of tests to ensure correctness

Options

filterFn

Type: function
Default: undefined

Takes arguments key and value (value for given key) and called for every intermittent result. If function is defined and returns false, the entry is filtered from the final result.

breakFn

Type: function
Default: undefined

Takes arguments key and value (value for given key) and called for every intermittent result. If function is defined and returns true, all nested entries under the current key are excluded from the result.

callbackFn

Type: function
Default: undefined

Takes arguments key and value (value for given key) and called for every final result.

joined

Type: boolean
Default: true

Can be set to false to return each key as a list. When dealing with special characters this can be useful.

Important: Setting this to false improves performance.

escapePaths

Type: boolean
Default: `true

When set to false, joined paths for functions and the final result are not escaped.

useArraySelector

Type: boolean
Default: `true

When set to false no array selectors are used and arrays are automatically traversed.

Examples

More extensive examples can be found in the tests.

const objectScan = require('object-scan');

const obj = {
  a: {
    b: {
      c: 'd'
    },
    e: {
      f: 'g'
    },
    h: ["i", "j"]
  },
  k: "l"
};

// top level keys
objectScan(["*"])(obj);
// => ["a", "k"]

// nested keys
objectScan(["a.*.f"])(obj);
// => ["a.e.f"]
objectScan(["*.*.*"])(obj);
// => ["a.b.c", "a.e.f"]

// or filter
objectScan(["a.*.{c,f}"])(obj);
// => ["a.b.c", "a.e.f"]
objectScan(["a.*.{c,f}"], { joined: false })(obj);
// => [["a", "b", "c"], ["a", "e", "f"]]

// list filter
objectScan(["*.*[*]"])(obj);
// => ["a.h[0]", "a.h[1]"]
objectScan(["*[*]"])(obj);
// => []

// deep star filter
objectScan(["**"])(obj);
// => ["a", "a.b", "a.b.c", "a.e", "a.e.f", "a.h", "a.h[0]", "a.h[1]", "k"]
objectScan(["**.f"])(obj);
// => ["a.e.f"]
objectScan(["**[*]"])(obj);
// => ["a.h[0]", "a.h[1]"]

// value function
objectScan(["**"], { filterFn: (key, value) => typeof value === "string" })(obj);
// => ["a.b.c", "a.e.f", "a.h[0]", "a.h[1]", "k"]
objectScan(["**"], { breakFn: key => key === "a.b" })(obj);
// => ["a", "a.b", "a.e", "a.e.f", "a.h", "a.h[0]", "a.h[1]", "k"]);

Special Characters

The following Characters are considered special and need to be escaped if they should be matched in a key: [, ], {, }, ,, . and *.

When dealing with special characters the joined option might be desirable to set to false.