portal-x/backend-project-lvl2

View on GitHub
src/buildTree.js

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
import _ from 'lodash';

const buildTree = (objectBefore, objectAfter) => {
  const keys = _.union(
    Object.keys(objectBefore), Object.keys(objectAfter),
  ).sort();

  const tree = keys.map((key) => {
    if (!_.has(objectAfter, key)) {
      return { key, type: 'removed', valueBefore: objectBefore[key] };
    }
    if (!_.has(objectBefore, key)) {
      return { key, type: 'added', valueBefore: objectAfter[key] };
    }
    if (_.isObject(objectBefore[key]) && _.isObject(objectAfter[key])) {
      return {
        key,
        type: 'node',
        children: buildTree(objectBefore[key], objectAfter[key]),
      };
    }
    if (objectBefore[key] === objectAfter[key]) {
      return { key, type: 'unchanged', valueBefore: objectAfter[key] };
    }
    return {
      key, type: 'changed', valueBefore: objectBefore[key], valueAfter: objectAfter[key],
    };
  });

  return tree;
};

export default buildTree;