1.0.9 • Published 3 years ago
deepdown v1.0.9
deepdown
Safely drill into your JavaScript objects with dynamically defined paths
Install
npm install --save deepdown
Example assignByKey
const parent = {
  child: {
    grandchild: {
      attribute: 'placeholder'
    }
  }
}
const path = 'child.grandchild.attribute'.split('.')
const value = 'value'
assignByKey(parent, path, value)
console.log(drillDown(parent, path))
/* prints
value
*/Example drillDown
const drillDown = require('deepdown').drillDown;
const appState = {
  nested: {
    dynamic: {
      data: true,
      error: false
    },
    static: {
      other: 'stuff'
    }
  }
};
const route = 'data';
const choice = true;
const path = ['nested', choice ? 'dynamic' : 'static'];
path.push(route);
// --- no crashes even if path is wrong
const result = drillDown(appState, path);
console.log('or be brave', drillDown(appState, `wrong.${!choice ? 'static' : null}.${route}`.split('.')));
// --- what you've been doing
// to avoid crashes involves tedious, statically defined checks
const safeResult = appState.nested && appState.nested.static && appState.nested.static.other;Example sortByKey
const sortByKey = require('deepdown').sortByKey;
const data = [
  {child: {grandchild: {value: 'bbb'}}}, // 'bbb' is greater than 'aaa'
  {child: {grandchild: {value: 'aaa'}}},
];
const firstValueBeforeSort = data[0].child.grandchild.value;
console.log(firstValueBeforeSort)
/* prints
bbb
*/
// --- sort by a nested key --- //
const key = 'child.grandchild.value'.split('.')
data.sort(sortByKey({key, order: true}));
const firstValueAfterSort = data[0].child.grandchild.value;
console.log(firstValueAfterSort)
/* prints
aaa
*/Example equality
const equality = require('deepdown').equality;
const data = [
  {child: {grandchild: {value: 'bbb'}}}, // 'bbb' is greater than 'aaa'
  {child: {grandchild: {value: 'aaa'}}},
];
const data = [
  {child: {grandchild: {value: 'bbb'}}},
  {child: {grandchild: {value: 'aaa'}}},
];
const found = data.find(equality('child.grandchild.value'.split('.'), 'aaa'));
console.log(found);
/* prints
{ child: { grandchild: { value: 'aaa' } } }
*/Example filterByKey
const filterByKey = require('deepdown').filterByKey;
const data = [
  {child: {grandchild: {value: 'bbb'}}},
  {child: {grandchild: {value: 'aaa'}}},
];
const key = 'child.grandchild.value'.split('.')
const value = 'aaa' // only looking for matches with `aaa`
const result = data.filter(filterByKey({key, value}))
console.log(JSON.stringify(result))
/* prints
[{"child":{"grandchild":{"value":"aaa"}}}]
*/Example unwindByKey
const unwindByKey = require('deepdown').unwindByKey;
const data = [
    {child: {grandchild: {value: ['aaa', 'bbb', 'ccc']}}},
    {child: {grandchild: {value: ['ddd', 'eee', 'fff']}}},
];
const keyPath = 'child.grandchild.value'.split('.')
const result = unwindByKey(data, keyPath)
console.log(JSON.stringify(result))
/* prints
[
  {"child":{"grandchild":{"value":"aaa"}}},
  {"child":{"grandchild":{"value":"bbb"}}},
  {"child":{"grandchild":{"value":"ccc"}}},
  {"child":{"grandchild":{"value":"ddd"}}},
  {"child":{"grandchild":{"value":"eee"}}},
  {"child":{"grandchild":{"value":"fff"}}}
]
*/Example indexByKey
const indexByKey = require('deepdown').indexByKey;
const data = [
    {child: {grandchild: {value: 'bbb'}}},
    {child: {grandchild: {value: 'aaa'}}},
];
const keyPath = 'child.grandchild.value'.split('.')
const result = indexByKey(data, keyPath)
console.log(JSON.stringify(result))
/* prints
{
  "bbb":[{"child":{"grandchild":{"value":"bbb"}}}],
  "aaa":[{"child":{"grandchild":{"value":"aaa"}}}]
}
*/Commands
- npm test- Run tests with linting and coverage results.
- npm run lint- Run ESlint with airbnb-config
- npm run build- Babel will transpile ES6 => ES5 and minify the code.
- npm run prepublish- Hook for npm. Do all the checks before publishing your module.