hedera-web/js/vn/value.js

192 lines
4.2 KiB
JavaScript

var VnDate = require('./date');
/**
* Clones a simple value. A simple value is any value that is not an array,
* object or function. If non-simple value is passed, the same object reference
* is returned.
*
* @param {*} value The value to be copied
* @return {*} The value copy
*/
function simpleClone(value) {
if (value instanceof Date)
return value.clone();
return value;
}
/**
* Checks if two simple values are equal using the strict equality operator. For
* information about simple values see simpleClone() function.
*
* @param {*} a Value to compare to
* @param {*} b Value to compare with
* @return {boolean} %true if they are equal, %false otherwise
*/
function simpleEquals(a, b) {
if (a === b)
return true;
if (a instanceof Date && b instanceof Date)
return a.getTime() === b.getTime();
return false;
}
/**
* Calculates differences between two simple key-value objects.
*
* @param {Object} orgObject Value to compare to
* @param {Object} newObject Value to compare with
* @return {Object} The differences or %null if there are no differences
*/
function diff(orgObject, newObject) {
var diff = {};
for (var key in orgObject)
if (!simpleEquals(orgObject[key], newObject[key]))
diff[key] = simpleClone(newObject[key]);
for (var key in newObject)
if (orgObject[key] === undefined && newObject[key] !== undefined)
diff[key] = simpleClone(newObject[key]);
if (Object.keys(diff).length > 0)
return diff;
return null;
}
/**
* Calculates new differences between two simple key-value objects.
*
* @param {Object} orgObject Value to compare to
* @param {Object} newObject Value to compare with
* @return {Object} The differences or %null if there are no differences
*/
function partialDiff(orgObject, newObject) {
var diff = {};
for (var key in newObject)
if (!simpleEquals(orgObject[key], newObject[key]))
diff[key] = simpleClone(newObject[key]);
if (Object.keys(diff).length > 0)
return diff;
return null;
}
/**
* Clones a simple key-value object in wich properties are simple values. For
* information about simple values see simpleClone() function.
*
* @param {*} object The object to be cloned
* @return The cloned object
*/
function kvClone(object) {
var copy = {};
for (var key in object)
copy[key] = simpleClone(object[key]);
return copy;
}
/**
* Checks if two values are equal, it also checks objects. Basic values are
* compared using the strict equality operator.
*
* @param {*} a Value to compare to
* @param {*} b Value to compare with
* @return {boolean} %true if they are equal, %false otherwise
*/
function equals(a, b) {
if (a === b)
return true;
if (a instanceof Date && b instanceof Date)
return a.getTime() === b.getTime();
if (a && b && (typeof a === 'object') && (typeof b === 'object')) {
for (var key in a)
if (!equals(a[key], b[key]))
return false;
for (var key in b)
if (a[key] === undefined && b[key] !== undefined)
return false;
return true;
}
return false;
}
/**
* Returns a formated string.
*
* @param {Object} formatString The base string template
* @param {...} arguments Format parameters
* @return {string} The formated string
*/
function sprintf(formatString) {
var args = arguments;
if (args.length <= 1)
return formatString;
var i = 1;
return formatString.replace(/%[s|d]/g, function() {
return args[i++];
});
}
module.exports = {
regexpNumber: /%\.([0-9]+)d/g
,regexpString: /%s/g
,equals
,diff
,partialDiff
,kvClone
,simpleClone
,simpleEquals
,sprintf
,compare(a, b) {
if (a === b)
return true;
if (a instanceof Date && b instanceof Date)
return a.getTime() === b.getTime();
return false;
}
,format(value, format) {
if (value === null || value === undefined)
return '';
if (format)
switch (typeof value) {
case 'number':
return format.replace(this.regexpNumber,
this.replaceNumber.bind(null, value));
case 'string':
return format.replace(this.regexpString,
this.replaceString.bind(null, value));
case 'object':
if (value instanceof Date)
return VnDate.strftime(value, format);
}
return value;
}
,replaceNumber(value, token, digits) {
return new Number(value).toFixed(parseInt(digits));
}
,replaceString(value) {
return value;
}
};