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
JavaScript
;
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;