Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More โ†’
Socket
Sign inDemoInstall
Socket

deepdash

Package Overview
Dependencies
Maintainers
1
Versions
112
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

deepdash

โž” ๐ƒeep extension for ๐‹odash: โœ“ eachDeep โœ“ filterDeep โœ“ pickDeep โœ“ omitDeep โœ“ keysDeep โœ“ indexate โœ“ condenseDeep โ‹ฎ Parent nodes tracking โ‹ฎ Circular references check โ‹ฎ Leaves only mode โ‹ฎ Path as a valid js string or an array โ‹ฎ

  • 3.1.3
  • Source
  • npm
  • Socket score

Version published
Maintainers
1
Created
Source

Deepdash

Looking for eachDeep, filterDeep, omitDeep, keysDeep etc? Tree traversal extension for Lodash.

Known Vulnerabilities Travis (.org) Coverage Status
NPM

Installation

In a browser load script after Lodash:

<script src="https://cdn.jsdelivr.net/npm/lodash/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/deepdash/deepdash.min.js"></script>

Using npm:

npm i --save deepdash

In Node.js (same for the Angular component):

//mixin new methods into Lodash object
const _ = require('deepdash')(require('lodash'));

Or as ECMAScript Module:

import lodash from "lodash";
import deepdash from "deepdash";
const _ = deepdash(lodash);

Demo

Example react+redux app with nested comments filtered by Deepdash.(play with code here)

Methods

eachDeep(forEachDeep) - iterate over all the children and sub-children (๐Ÿ“š docs)

Example

children example collection is here

  let children = [/* ... */];
  function displayField(val, key, parent, context) {
      if (_.isArray(parent)) {
        key = '[' + key + ']';
      }
      console.log(
        _.repeat('   ', context.depth) +
          'โ†’ ' +
          key +
          ': ' +
          (_.isArray(val)
            ? '[' + val.length + ']'
            : _.isObject(val)
            ? '{' + (val.name || '') + '}'
            : val)
      );
    }

    console.log('\n = Iterate over tree (each child object) = \n');

    _.eachDeep(children, displayField, { tree: true });

    console.log('\n = Iterate over object (each field) = \n');

    _.eachDeep(children, displayField);

Console:

 = Iterate over tree (each child object) =

โ†’ [0]: {node 1}
      โ†’ [0]: {node 1.1}
      โ†’ [1]: {node 1.2}
      โ†’ [2]: {node 1.3}
โ†’ [1]: {node 2}
      โ†’ [0]: {node 2.1}
      โ†’ [1]: {node 2.2}
      โ†’ [2]: {node 2.3}
โ†’ [2]: {node 3}
      โ†’ [0]: {node 3.1}
      โ†’ [1]: {node 3.2}
      โ†’ [2]: {node 3.3}

 = Iterate over object (each field) =

โ†’ [0]: {node 1}
   โ†’ description: description for node 1
   โ†’ comment: comment for node 1
   โ†’ note: note for node 1
   โ†’ name: node 1
   โ†’ bad: false
   โ†’ children: [3]
      โ†’ [0]: {node 1.1}
         โ†’ description: description for node 1.1
         โ†’ comment: comment for node 1.1
         โ†’ note: note for node 1.1
         โ†’ name: node 1.1
         โ†’ bad: false
      โ†’ [1]: {node 1.2}
         โ†’ description: description for node 1.2
         โ†’ comment: comment for node 1.2
         โ†’ note: note for node 1.2
         โ†’ name: node 1.2
         โ†’ good: true
      โ†’ [2]: {node 1.3}
         โ†’ description: description for node 1.3
         โ†’ comment: comment for node 1.3
         โ†’ note: note for node 1.3
         โ†’ name: node 1.3
         โ†’ bad: true
         โ†’ good: false
โ†’ [1]: {node 2}
   โ†’ description: description for node 2
   โ†’ comment: comment for node 2
   โ†’ note: note for node 2
   โ†’ name: node 2
   โ†’ good: true
   โ†’ children: [3]
      โ†’ [0]: {node 2.1}
         โ†’ description: description for node 2.1
         โ†’ comment: comment for node 2.1
         โ†’ note: note for node 2.1
         โ†’ name: node 2.1
         โ†’ bad: false
      โ†’ [1]: {node 2.2}
         โ†’ description: description for node 2.2
         โ†’ comment: comment for node 2.2
         โ†’ note: note for node 2.2
         โ†’ name: node 2.2
         โ†’ good: true
      โ†’ [2]: {node 2.3}
         โ†’ description: description for node 2.3
         โ†’ comment: comment for node 2.3
         โ†’ note: note for node 2.3
         โ†’ name: node 2.3
         โ†’ bad: true
         โ†’ good: false
โ†’ [2]: {node 3}
   โ†’ description: description for node 3
   โ†’ comment: comment for node 3
   โ†’ note: note for node 3
   โ†’ name: node 3
   โ†’ bad: true
   โ†’ good: false
   โ†’ children: [3]
      โ†’ [0]: {node 3.1}
         โ†’ description: description for node 3.1
         โ†’ comment: comment for node 3.1
         โ†’ note: note for node 3.1
         โ†’ name: node 3.1
         โ†’ bad: false
      โ†’ [1]: {node 3.2}
         โ†’ description: description for node 3.2
         โ†’ comment: comment for node 3.2
         โ†’ note: note for node 3.2
         โ†’ name: node 3.2
         โ†’ good: true
      โ†’ [2]: {node 3.3}
         โ†’ description: description for node 3.3
         โ†’ comment: comment for node 3.3
         โ†’ note: note for node 3.3
         โ†’ name: node 3.3
         โ†’ bad: true
         โ†’ good: false

filterDeep - deep filter object (๐Ÿ“š docs)

Example

children example collection is here

  let children = [/* ... */];
  console.log('\n = Filter tree (good children) = \n');

  console.log(
    _.filterDeep(children, 'good', { tree: true })
  );

  console.log('\n = Filter object (names of good children) = \n');

  console.log(
      _.filterDeep(children, (val, key, parent) => {
        if (key == 'name' && parent.good) return true;
      })
  );

Console:

 = Filter tree (good children) =

[
  {
    "description": "description for node 1",
    "comment": "comment for node 1",
    "note": "note for node 1",
    "name": "node 1",
    "bad": false,
    "children": [
      {
        "description": "description for node 1.2",
        "comment": "comment for node 1.2",
        "note": "note for node 1.2",
        "name": "node 1.2",
        "good": true
      }
    ]
  },
  {
    "description": "description for node 2",
    "comment": "comment for node 2",
    "note": "note for node 2",
    "name": "node 2",
    "good": true,
    "children": [
      {
        "description": "description for node 2.2",
        "comment": "comment for node 2.2",
        "note": "note for node 2.2",
        "name": "node 2.2",
        "good": true
      }
    ]
  },
  {
    "description": "description for node 3",
    "comment": "comment for node 3",
    "note": "note for node 3",
    "name": "node 3",
    "bad": true,
    "good": false,
    "children": [
      {
        "description": "description for node 3.2",
        "comment": "comment for node 3.2",
        "note": "note for node 3.2",
        "name": "node 3.2",
        "good": true
      }
    ]
  }
]

 = Filter object (names of good children) =

[
  {
    "children": [
      {
        "name": "node 1.2"
      }
    ]
  },
  {
    "name": "node 2",
    "children": [
      {
        "name": "node 2.2"
      }
    ]
  },
  {
    "children": [
      {
        "name": "node 3.2"
      }
    ]
  }
]

pickDeep - get object only with keys specified by names or regexes (๐Ÿ“š docs)

Example

children example collection is here

  let children = [/* ... */];
  console.log('\n = Pick name and description only = \n');

  console.log(
    _.pickDeep(children, ['name', 'description'])
  );

Console:

 = Pick name and description only =

[
  {
    "description": "description for node 1",
    "name": "node 1",
    "children": [
      {
        "description": "description for node 1.1",
        "name": "node 1.1"
      },
      {
        "description": "description for node 1.2",
        "name": "node 1.2"
      },
      {
        "description": "description for node 1.3",
        "name": "node 1.3"
      }
    ]
  },
  {
    "description": "description for node 2",
    "name": "node 2",
    "children": [
      {
        "description": "description for node 2.1",
        "name": "node 2.1"
      },
      {
        "description": "description for node 2.2",
        "name": "node 2.2"
      },
      {
        "description": "description for node 2.3",
        "name": "node 2.3"
      }
    ]
  },
  {
    "description": "description for node 3",
    "name": "node 3",
    "children": [
      {
        "description": "description for node 3.1",
        "name": "node 3.1"
      },
      {
        "description": "description for node 3.2",
        "name": "node 3.2"
      },
      {
        "description": "description for node 3.3",
        "name": "node 3.3"
      }
    ]
  }
]

omitDeep - get object without keys specified by names or regexes (๐Ÿ“š docs)

Example

children example collection is here

  let children = [/* ... */];
  console.log('\n = Omit paths not ending with "e" = \n');

  console.log(
    _.omitDeep(children, /[^e]$/i, { onMatch: { skipChildren: false } }),
  );

Console:

 = Omit paths not ending with "e" =

[
  {
    "note": "note for node 1",
    "name": "node 1",
    "children": [
      {
        "note": "note for node 1.1",
        "name": "node 1.1"
      },
      {
        "note": "note for node 1.2",
        "name": "node 1.2"
      },
      {
        "note": "note for node 1.3",
        "name": "node 1.3"
      }
    ]
  },
  {
    "note": "note for node 2",
    "name": "node 2",
    "children": [
      {
        "note": "note for node 2.1",
        "name": "node 2.1"
      },
      {
        "note": "note for node 2.2",
        "name": "node 2.2"
      },
      {
        "note": "note for node 2.3",
        "name": "node 2.3"
      }
    ]
  },
  {
    "note": "note for node 3",
    "name": "node 3",
    "children": [
      {
        "note": "note for node 3.1",
        "name": "node 3.1"
      },
      {
        "note": "note for node 3.2",
        "name": "node 3.2"
      },
      {
        "note": "note for node 3.3",
        "name": "node 3.3"
      }
    ]
  }
]

indexate - get an object with all the paths as keys and corresponding values (๐Ÿ“š docs)

Example
  let index = _.indexate(
    {
      a: {
        b: {
          c: [1, 2, 3],
          'hello world': {},
        },
      },
    },
    { leavesOnly: true }
  );
  console.log(index);

Console:

{ 'a.b.c[0]': 1,
  'a.b.c[1]': 2,
  'a.b.c[2]': 3,
  'a.b["hello world"]': {} }

paths(keysDeep) - get an array of paths (๐Ÿ“š docs)

Example
  let paths = _.paths(
    {
      a: {
        b: {
          c: [1, 2, 3],
          'hello world': {},
        },
      },
    },
    { leavesOnly: false }
  );
  console.log(paths);

Console:

[ 'a',
  'a.b',
  'a.b.c',
  'a.b.c[0]',
  'a.b.c[1]',
  'a.b.c[2]',
  'a.b["hello world"]' ]

condense - condense sparse array (๐Ÿ“š docs)

Example
  let arr = ['a', 'b', 'c', 'd', 'e'];
  delete arr[1];
  console.log(arr);
  delete arr[3];
  console.log(arr);
  _.condense(arr);
  console.log(arr);

Console:

  [ 'a', <1 empty item>, 'c', 'd', 'e' ]
  [ 'a', <1 empty item>, 'c', <1 empty item>, 'e' ]
  [ 'a', 'c', 'e' ]

condenseDeep - condense all the nested arrays (๐Ÿ“š docs)

Example
  let obj = { arr: ['a', 'b', { c: [1, , 2, , 3] }, 'd', 'e'] };
  delete obj.arr[1];
  delete obj.arr[3];
  _.condenseDeep(obj);
  console.log(obj);

Console:

  { arr: [ 'a', { c: [ 1, 2, 3 ] }, 'e' ] }

exists - like a _.has but returns false for empty array slots (๐Ÿ“š docs)

Example
  var obj = [, { a: [, 'b'] }];
  console.log(_.exists(obj, 0)); // false
  console.log(_.exists(obj, 1)); // true
  console.log(_.exists(obj, '[1].a[0]')); // false
  console.log(_.exists(obj, '[1].a[1]')); // true

pathToString - convert an array to string path (opposite to _.toPath) (๐Ÿ“š docs)

Example
  console.log(_.pathToString(['a', 'b', 'c', 'defg', 0, '1', 2.3]));
  // a.b.c.defg[0][1]["2.3"]
  console.log(_.pathToString(['"', '"', '"']));
  // ["\\""]["\\""]["\\""]
  console.log(_.pathToString('it.s.a.string'));
  // it.s.a.string
Example Collection
'children' object used in examples above
let children = [
  {
    description: 'description for node 1',
    comment: 'comment for node 1',
    note: 'note for node 1',
    name: 'node 1',
    bad: false,
    children: [
      {
        description: 'description for node 1.1',
        comment: 'comment for node 1.1',
        note: 'note for node 1.1',
        name: 'node 1.1',
        bad: false,
      },
      {
        description: 'description for node 1.2',
        comment: 'comment for node 1.2',
        note: 'note for node 1.2',
        name: 'node 1.2',
        good: true,
      },
      {
        description: 'description for node 1.3',
        comment: 'comment for node 1.3',
        note: 'note for node 1.3',
        name: 'node 1.3',
        bad: true,
        good: false,
      },
    ],
  },
  {
    description: 'description for node 2',
    comment: 'comment for node 2',
    note: 'note for node 2',
    name: 'node 2',
    good: true,
    children: [
      {
        description: 'description for node 2.1',
        comment: 'comment for node 2.1',
        note: 'note for node 2.1',
        name: 'node 2.1',
        bad: false,
      },
      {
        description: 'description for node 2.2',
        comment: 'comment for node 2.2',
        note: 'note for node 2.2',
        name: 'node 2.2',
        good: true,
      },
      {
        description: 'description for node 2.3',
        comment: 'comment for node 2.3',
        note: 'note for node 2.3',
        name: 'node 2.3',
        bad: true,
        good: false,
      },
    ],
  },
  {
    description: 'description for node 3',
    comment: 'comment for node 3',
    note: 'note for node 3',
    name: 'node 3',
    bad: true,
    good: false,
    children: [
      {
        description: 'description for node 3.1',
        comment: 'comment for node 3.1',
        note: 'note for node 3.1',
        name: 'node 3.1',
        bad: false,
      },
      {
        description: 'description for node 3.2',
        comment: 'comment for node 3.2',
        note: 'note for node 3.2',
        name: 'node 3.2',
        good: true,
      },
      {
        description: 'description for node 3.3',
        comment: 'comment for node 3.3',
        note: 'note for node 3.3',
        name: 'node 3.3',
        bad: true,
        good: false,
      },
    ],
  },
];

See full docs for details.

Keywords

FAQs

Package last updated on 10 Mar 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with โšก๏ธ by Socket Inc