UNPKG

object-deep-recreate

Version:

Re-create deep level changed objects in memory while keeping the same reference for unchanged objects

69 lines (68 loc) 2.53 kB
"use strict"; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.appendNewObjectValues = exports.deepRecreate = void 0; /** * Make sure the compared values are of the same type * @param newValue - altered in-memory data * @param prevValue - cloned snapshot of previous data */ function deepRecreate(newValue, prevValue) { if (typeof newValue !== typeof prevValue) { // comparing different types return newValue; } // for primitive types return new value right away if (!newValue || !prevValue || typeof newValue !== 'object') return newValue; if (Array.isArray(newValue)) { if (!Array.isArray(prevValue)) { console.warn('Comparing array with non-array'); return newValue; } if (JSON.stringify(newValue) === JSON.stringify(prevValue)) { return newValue; } var result_1; // check every element if same length if (newValue.length === prevValue.length) { result_1 = []; newValue.forEach(function (v, index) { var oldV = prevValue[index]; result_1.push(deepRecreate(v, oldV)); }); } else { // else removing or adding to array, just create a new instance result_1 = __spreadArray([], newValue, true); } return result_1; } return appendNewObjectValues(newValue, prevValue); } exports.deepRecreate = deepRecreate; /** * @param newObject * @param prevObject - cloned snapshot of previous data */ function appendNewObjectValues(newObject, prevObject) { if (!newObject || JSON.stringify(newObject) === JSON.stringify(prevObject)) return newObject; var result = {}; Object.keys(newObject).forEach(function (key) { var _a, _b; var newValue = (_a = newObject) === null || _a === void 0 ? void 0 : _a[key]; var prevValue = (_b = prevObject) === null || _b === void 0 ? void 0 : _b[key]; result[key] = deepRecreate(newValue, prevValue); }); return result; } exports.appendNewObjectValues = appendNewObjectValues;