@silvered/flatten-object-keys
TypeScript icon, indicating that this package has built-in type declarations

1.0.5 • Public • Published

flatten-object-keys

Turn deeply nested object into any array of keys. This is useful if you need to write algorithms and transformation that are taxonomy independent.

Install

npm install @silvered-nyc/flatten-object-keys

Import

import { flattenObjectKeys } from "@silvered-nyc/flatten-object-keys";

Simple example

import { flattenObjectKeys } from "@silvered-nyc/flatten-object-keys";

const object = {
    name: "robert",
    age: 10,
  };

const keys = flattenObjectKeys(object);
// keys -> ["name","age"]

Array example

import { flattenObjectKeys } from "@silvered-nyc/flatten-object-keys";

const object = ["swiming", "sailing", "surfing", "basketball"];

const keys = flattenObjectKeys(object);

// keys -> ["[0]","[1]","[2]","[3]"]

Nested example

import { flattenObjectKeys } from "@silvered-nyc/flatten-object-keys";
const object = {
    name: "robert",
    age: 10,
    dogs: {
      alive: {
        name: "skipper",
      },
      passed: {
        name: "carmel",
      },
    },
  };
const keys = flattenObjectKeys(object);
// keys -> ["name","age","dogs.alive.name","dogs.alive","dogs.passed.name","dogs.passed"]

Taxonomy Independent Algorithm Example: Bag of Words

import { flattenObjectKeys } from "@silvered-nyc/flatten-object-keys";
import _ from "lodash";

const object = {
    firstName: "robert",
    age: 28,
    social: {
      header: "Good mindsets help",
      posts: {
        recent: ["Good things on the way"],
      },
    },
    views: {
      life: [
        "The best is yet to be",
        "Do good and good will come to you.",
        "You can't go through life allowing pain to dictate how you behave",
        "Pain is inevitable, suffering is optional",
      ],
    },
  };

const keys = flattenObjectKeys(object);

  const bagOfWords = keys.reduce(
    (pv: { [key: string]: { count: number; sources: string[] } }, key) => {
      // lodash to get nested value
      const value = _.get(object, key);

      // is the value at the key a string
      if (_.isString(value)) {
        value
          .toLowerCase()
          .split(" ")
          // loop through words and build bag of words
          .forEach((e) => {
            // its allready initialized
            if (pv[e]) {
              pv[e] = {
                count: pv[e].count + 1,
                sources: [...pv[e].sources, key],
              };
            } else {
              pv[e] = { count: 1, sources: [key] };
            }
          });
      }
      return pv;
    },
    {}
  );
  
// bagOfWords -> {
//     robert: { count: 1, sources: ["firstName"] },
//     good: {
//       count: 4,
//       sources: [
//         "social.header",
//         "social.posts.recent[0]",
//         "views.life[1]",
//         "views.life[1]",
//       ],
//     },
//     mindsets: { count: 1, sources: ["social.header"] },
//     help: { count: 1, sources: ["social.header"] },
//     things: { count: 1, sources: ["social.posts.recent[0]"] },
//     on: { count: 1, sources: ["social.posts.recent[0]"] },
//     the: { count: 2, sources: ["social.posts.recent[0]", "views.life[0]"] },
//     way: { count: 1, sources: ["social.posts.recent[0]"] },
//     best: { count: 1, sources: ["views.life[0]"] },
//     is: {
//       count: 3,
//       sources: ["views.life[0]", "views.life[3]", "views.life[3]"],
//     },
//     yet: { count: 1, sources: ["views.life[0]"] },
//     to: {
//       count: 3,
//       sources: ["views.life[0]", "views.life[1]", "views.life[2]"],
//     },
//     be: { count: 1, sources: ["views.life[0]"] },
//     do: { count: 1, sources: ["views.life[1]"] },
//     and: { count: 1, sources: ["views.life[1]"] },
//     will: { count: 1, sources: ["views.life[1]"] },
//     come: { count: 1, sources: ["views.life[1]"] },
//     "you.": { count: 1, sources: ["views.life[1]"] },
//     you: { count: 2, sources: ["views.life[2]", "views.life[2]"] },
//     "can't": { count: 1, sources: ["views.life[2]"] },
//     go: { count: 1, sources: ["views.life[2]"] },
//     through: { count: 1, sources: ["views.life[2]"] },
//     life: { count: 1, sources: ["views.life[2]"] },
//     allowing: { count: 1, sources: ["views.life[2]"] },
//     pain: { count: 2, sources: ["views.life[2]", "views.life[3]"] },
//     dictate: { count: 1, sources: ["views.life[2]"] },
//     how: { count: 1, sources: ["views.life[2]"] },
//     behave: { count: 1, sources: ["views.life[2]"] },
//     "inevitable,": { count: 1, sources: ["views.life[3]"] },
//     suffering: { count: 1, sources: ["views.life[3]"] },
//     optional: { count: 1, sources: ["views.life[3]"] },
//   }

Readme

Keywords

Package Sidebar

Install

npm i @silvered/flatten-object-keys

Weekly Downloads

8

Version

1.0.5

License

ISC

Unpacked Size

86.9 kB

Total Files

13

Last publish

Collaborators

  • silvered-nyc