/object-rewrite

Rewrite an Object

Primary LanguageJavaScriptMIT LicenseMIT

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

object-rewrite

Rewrite an Object by defining exactly what gets excluded, injected and retained.

Install

npm i --save object-rewrite

Getting Started

Modifies the data object in place. If you need to create a copy consider using _.deepClone().

const objectRewrite = require("object-rewrite");

const data = [{
  guid: "aad8b948-a3de-4bff-a50f-3d59e9510aa9",
  count: 3,
  active: "yes",
  tags: [{ id: 1 }, { id: 2 }, { id: 3 }]
}, {
  guid: "4409fb72-36e3-4385-b3da-b4944d028dcb",
  count: 4,
  active: "yes",
  tags: [{ id: 2 }, { id: 3 }, { id: 4 }]
}, {
  guid: "96067a3c-caa2-4018-bcec-6969a874dad9",
  count: 5,
  active: "no",
  tags: [{ id: 3 }, { id: 4 }, { id: 5 }]
}];

const rewriter = objectRewrite({
  exclude: {
    "": (key, value, parents) => value.active !== "yes",
    tags: (key, value, parents) => value.id !== 4
  },
  inject: {
    "": (key, value, parents) => ({ countNext: value.count + 1 })
  },
  overwrite: {
    active: (key, value) => value === "yes"
  },
  retain: ["count", "countNext", "active", "tags.id"]
});

rewriter(data);

// => data is now modified
/*
[{
  "count": 3,
  "countNext": 4,
  "active": true,
  "tags": []
}, {
  "count": 4,
  "countNext": 5,
  "active": true,
  "tags": [{"id": 4}]
}]
*/

The empty needle "" matches top level object(s).

Modifiers

Needles are specified according to object-scan.

Internally the option useArraySelector is set to false.

Functions have signature Fn(key, value, parents) as specified by object-scan. Keys are split (joined is false),

Exclude

Takes object where keys are needles and values are functions. The matches for a needle are removed from the object iff the corresponding function execution returns true.

Inject

Takes object where keys are needles and values are functions. For every match the corresponding function is executed and the result merged into the match. The match and the function response are expected to be objects.

Overwrite

Takes object where keys are needles and values are functions. For every match the corresponding function is executed and the result is assigned to the key.

Retain

Array of needles. Matches are kept if not excluded previously. All entries not matched are excluded. Defaults to ["**"] which matches all entries.

Deficiencies

Problems when different matchers are used between exclude, inject, overwrite, retain that target the same elements. E.g. using ** for retain, but *.field for inject.