object/object_diff.js

//Initialise functions
{
	if (!global.Object) global.Object = {};
	
	/**
	 * Computes object-level diff. Returns only the keys of 'prev_obj' whose values differ from or are absent in 'next_obj'. This is what gets stored in every non-head keyframe.
	 * @alias Object.computeNegativeDiff
	 * 
	 * @param {Object} arg0_prev_obj
	 * @param {Object} arg1_next_obj
	 * 
	 * @returns {Object} 
	 */
	Object.computeNegativeDiff = function (arg0_prev_obj, arg1_next_obj) {
		//Convert from parameters
		let prev_obj = (arg0_prev_obj) ? arg0_prev_obj : {};
		let next_obj = (arg1_next_obj) ? arg1_next_obj : {};
		
		//Declare local instance variables
		let all_keys = new Set([...Object.keys(prev_obj), ...Object.keys(next_obj)]);
		let diff_obj = {};
		
		//Iterate over all_keys
		for (let local_key of all_keys) {
			let next_value = (next_obj || {})[local_key];
			let previous_value = (prev_obj || {})[local_key];
			
			let next_json = JSON.stringify(next_value);
			let previous_json = JSON.stringify(previous_value);
			
			if (previous_json !== next_json)
				//Store what the previous keyframe had (or undefined sentinel)
				diff_obj[local_key] = (previous_value !== undefined) ? structuredClone(previous_value) : null;
		}
		
		//Return statement
		return diff_obj;
	};
}