Flatten

Flatten or unflatten a nested Javascript object by delimiter keys.

Usage

Flatten

import { flatten } from "https://deno.land/x/flatten/mod.ts";

const obj = {
  key1: {
    keyA: "valueI",
  },
  key2: {
    keyB: "valueII",
  },
  key3: { a: { b: { c: 2 } } },
  arr: ["item1", null, ["nested1", "nested2"]],
};

flatten(obj);
// {
//   "key1.keyA": "valueI",
//   "key2.keyB": "valueII",
//   "key3.a.b.c": 2,
//   "arr.0": "item1",
//   "arr.1": null,
//   "arr.2.0": "nested1",
//   "arr.2.1": "nested2",
//   "arr.3.key4.nested": 1,
//   "arr.3.key5": undefined
// }

flatten(obj, { flattenArray: false });
// {
//   "key1.keyA": "valueI",
//   "key2.keyB": "valueII",
//   "key3.a.b.c": 2,
//   arr: [
//     "item1",
//     null,
//     [ "nested1", "nested2" ],
//     { key4: { nested: 1 }, key5: undefined }
//   ]
// }

flatten(obj, { delimiter: "--" });
// {
//   "key1--keyA": "valueI",
//   "key2--keyB": "valueII",
//   "key3--a--b--c": 2,
//   "arr--0": "item1",
//   "arr--1": null,
//   "arr--2--0": "nested1",
//   "arr--2--1": "nested2",
//   "arr--3--key4--nested": 1,
//   "arr--3--key5": undefined
// }

flatten(obj, ignoreIfProperty: ["key3"]);
// Since key3 is an ignored property b, then it will not be flattened
// {
//   "key1.keyA": "valueI",
//   "key2.keyB": "valueII",
//   "key3": { a: { b: { c: 2 } } },
//   "arr.0": "item1",
//   "arr.1": null,
//   "arr.2.0": "nested1",
//   "arr.2.1": "nested2",
//   "arr.3.key4.nested": 1,
//   "arr.3.key5": undefined
// }

flatten(obj, ignoreIfContainsProperty: ["b"]);
// Since key3.a contains an ignored property "b", then it will not be flattened
// {
//   "key1.keyA": "valueI",
//   "key2.keyB": "valueII",
//   "key3.a": { b: { c: 2 } },
//   "arr.0": "item1",
//   "arr.1": null,
//   "arr.2.0": "nested1",
//   "arr.2.1": "nested2",
//   "arr.3.key4.nested": 1,
//   "arr.3.key5": undefined
// }

Options

is an object composed of

delimiter: string (default = '.')
Use a custom delimiter instead of . when flattening your objects.

flattenArray: boolean (default = true)
Flatten the arrays and their items.

Unflatten

import { unflatten } from "https://deno.land/x/flatten/mod.ts";

const flattedObj = {
  "key1.keyA": "valueI",
  "key2.keyB": "valueII",
  "key3.a.b.c": 2,
  "arr.0": "item1",
  "arr.1": null,
  "arr.2.0": "nested1",
  "arr.2.1": "nested2",
  "arr.3.key4.nested": 1,
  "arr.3.key5": undefined,
};

unflatten(flattedObj);
// {
//   key1: {
//       keyA: 'valueI'
//   },
//   key2: {
//       keyB: 'valueII'
//   },
//   key3: { a: { b: { c: 2 } } },
//   arr: ['item1',null,['nested1', 'nested2']]
// }

const flattedObjWithDoubleDashes = {
  "key1--keyA": "valueI",
  "key2--keyB": "valueII",
  "key3--a--b--c": 2,
  "arr--0": "item1",
  "arr--1": null,
  "arr--2--0": "nested1",
  "arr--2--1": "nested2",
  "arr--3--key4--nested": 1,
  "arr--3--key5": undefined,
};

unflatten(flattedObjWithDoubleDashes, "--");
// {
//   key1: {
//       keyA: 'valueI'
//   },
//   key2: {
//       keyB: 'valueII'
//   },
//   key3: { a: { b: { c: 2 } } },
//   arr: ['item1',null,['nested1', 'nested2']]
// }

Options

delimiter: string (default = '.')
Use a custom delimiter instead of . when flattening your objects.

License

MIT