0.0.9 • Published 4 years ago

merge-tree v0.0.9

Weekly downloads
5
License
MIT
Repository
github
Last release
4 years ago

merge-tree

Returns a new tree with a mutation applied, without destroying the original tree.

Why?

There are several choices available today when it comes to using immutable data in JS. That includes Immutable-JS, mori and plain ol' Object.assign().

If you're sticking to plain ol' JS, Object.assign() works quite well. Until you get to recursive data structures or trees.

In the following example, let's say we want a new object with the "enabled" value of target node "x1/x1.1/x1.1.1/x1.1.1.2" set to false. Object.assign() will not work here because of the nesting.

data = {
  name: "x1",
  contents: [
    {
      name: "x1.1",
      contents: [
        {
          name: "x1.1.1",
          contents: [
            {
              name: "x1.1.1.1"
              enabled: true
            },
            {
              name: "x1.1.1.2",
              enabled: true
            }
          ]
        },
        {
          name: "x1.1.2"
        }
      ]
    }
  ]
}

Here's how you do it with merge tree

npm install merge-tree;

import mergeTree from "merge-tree";
const result = mergeTree(
  //data structure
  data,

  //array containing children
  "contents",

  //nodes to change. You can change any node, not just the edges.
  [
    { parents: ["x1", "x1.1", "x1.1.1"], target: { name: "x1.1.1.1", enabled: false } },
    { parents: ["x1", "x1.1", "x1.1.1"], target: { name: "x1.1.1.2", enabled: false } }
  ],

  //predicate which checks the name of the parents.
  (dir, b) => dir.name === b,

  //mutator function which changes the target node.
  (item, target) => item.name === target.name ?
    Object.assign({}, item, { enabled: target.enabled }) :
    item
);

To see a working example. check src/test/test.js

0.0.9

4 years ago

0.0.7

6 years ago

0.0.5

8 years ago

0.0.4

8 years ago

0.0.3

8 years ago

0.0.2

8 years ago

0.0.1

8 years ago