mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-14 23:17:33 +08:00
304 lines
7.0 KiB
JavaScript
304 lines
7.0 KiB
JavaScript
export function isFunction(val) {
|
|
return typeof(val) === 'function';
|
|
}
|
|
|
|
export function isObject(val) {
|
|
return val != null && typeof(val) === 'object' && !isArray(val);
|
|
}
|
|
|
|
export function isArray(val) {
|
|
if (isFunction(Array.isArray)) {
|
|
return Array.isArray(val);
|
|
}
|
|
|
|
return Object.prototype.toString.call(val) === '[object Array]';
|
|
}
|
|
|
|
export function isString(val) {
|
|
return typeof(val) === 'string';
|
|
}
|
|
|
|
export function isNumber(val) {
|
|
return typeof(val) === 'number';
|
|
}
|
|
|
|
export function isBoolean(val) {
|
|
return typeof(val) === 'boolean';
|
|
}
|
|
|
|
export function isEquals(obj1, obj2) {
|
|
if (obj1 === obj2) {
|
|
return true;
|
|
}
|
|
|
|
if (isArray(obj1) && isArray(obj2)) {
|
|
if (obj1.length !== obj2.length) {
|
|
return false;
|
|
}
|
|
|
|
for (let i = 0; i < obj1.length; i++) {
|
|
if (!isEquals(obj1[i], obj2[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
} else if (isObject(obj1) && isObject(obj2)) {
|
|
const keys1 = Object.keys(obj1);
|
|
const keys2 = Object.keys(obj2);
|
|
|
|
if (keys1.length !== keys2.length) {
|
|
return false;
|
|
}
|
|
|
|
const keyExistsMap2 = {};
|
|
|
|
for (let i = 0; i < keys2.length; i++) {
|
|
const key = keys2[i];
|
|
|
|
keyExistsMap2[key] = true;
|
|
}
|
|
|
|
for (let i = 0; i < keys1.length; i++) {
|
|
const key = keys1[i];
|
|
|
|
if (!keyExistsMap2[key]) {
|
|
return false;
|
|
}
|
|
|
|
if (!isEquals(obj1[key], obj2[key])) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
} else {
|
|
return obj1 === obj2;
|
|
}
|
|
}
|
|
|
|
export function appendThousandsSeparator(value, enable) {
|
|
if (!enable || value.length <= 3) {
|
|
return value;
|
|
}
|
|
|
|
const negative = value.charAt(0) === '-';
|
|
|
|
if (negative) {
|
|
value = value.substring(1);
|
|
}
|
|
|
|
const dotPos = value.indexOf('.');
|
|
const integer = dotPos < 0 ? value : value.substring(0, dotPos);
|
|
const decimals = dotPos < 0 ? '' : value.substring(dotPos + 1, value.length);
|
|
|
|
const finalChars = [];
|
|
|
|
for (let i = 0; i < integer.length; i++) {
|
|
if (i % 3 === 0 && i > 0) {
|
|
finalChars.push(',');
|
|
}
|
|
|
|
finalChars.push(integer.charAt(integer.length - 1 - i));
|
|
}
|
|
|
|
finalChars.reverse();
|
|
|
|
let newInteger = finalChars.join('');
|
|
|
|
if (negative) {
|
|
newInteger = `-${newInteger}`;
|
|
}
|
|
|
|
if (dotPos < 0) {
|
|
return newInteger;
|
|
} else {
|
|
return `${newInteger}.${decimals}`;
|
|
}
|
|
}
|
|
|
|
export function formatPercent(value, precision, lowPrecisionValue) {
|
|
const ratio = Math.pow(10, precision);
|
|
const normalizedValue = Math.floor(value * ratio);
|
|
|
|
if (value > 0 && normalizedValue < 1 && lowPrecisionValue) {
|
|
return lowPrecisionValue + '%';
|
|
}
|
|
|
|
const result = normalizedValue / ratio;
|
|
return result + '%';
|
|
}
|
|
|
|
export function limitText(value, maxLength) {
|
|
let length = 0;
|
|
|
|
for (let i = 0; i < value.length; i++) {
|
|
const c = value.charCodeAt(i);
|
|
|
|
if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
|
|
length++;
|
|
} else {
|
|
length += 2;
|
|
}
|
|
}
|
|
|
|
if (length <= maxLength || maxLength <= 3) {
|
|
return value;
|
|
}
|
|
|
|
return value.substring(0, maxLength - 3) + '...';
|
|
}
|
|
|
|
export function base64encode(arrayBuffer) {
|
|
if (!arrayBuffer || arrayBuffer.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
return btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));
|
|
}
|
|
|
|
export function base64decode(str) {
|
|
if (!str) {
|
|
return '';
|
|
}
|
|
|
|
return atob(str);
|
|
}
|
|
|
|
export function arrayBufferToString(arrayBuffer) {
|
|
return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));
|
|
}
|
|
|
|
export function stringToArrayBuffer(str){
|
|
return Uint8Array.from(str, c => c.charCodeAt(0)).buffer;
|
|
}
|
|
|
|
export function getNameByKeyValue(src, value, keyField, nameField, defaultName) {
|
|
if (isArray(src)) {
|
|
if (keyField) {
|
|
for (let i = 0; i < src.length; i++) {
|
|
const option = src[i];
|
|
|
|
if (option[keyField] === value) {
|
|
return option[nameField];
|
|
}
|
|
}
|
|
} else {
|
|
if (src[value]) {
|
|
const option = src[value];
|
|
|
|
return option[nameField];
|
|
}
|
|
}
|
|
} else if (isObject(src)) {
|
|
if (keyField) {
|
|
for (let key in src) {
|
|
if (!Object.prototype.hasOwnProperty.call(src, key)) {
|
|
continue;
|
|
}
|
|
|
|
const option = src[key];
|
|
|
|
if (option[keyField] === value) {
|
|
return option[nameField];
|
|
}
|
|
}
|
|
} else {
|
|
if (src[value]) {
|
|
const option = src[value];
|
|
|
|
return option[nameField];
|
|
}
|
|
}
|
|
}
|
|
|
|
return defaultName;
|
|
}
|
|
|
|
export function copyObjectTo(fromObject, toObject) {
|
|
if (!isObject(fromObject)) {
|
|
return toObject;
|
|
}
|
|
|
|
if (!isObject(toObject)) {
|
|
toObject = {};
|
|
}
|
|
|
|
for (let key in fromObject) {
|
|
if (!Object.prototype.hasOwnProperty.call(fromObject, key)) {
|
|
continue;
|
|
}
|
|
|
|
const fromValue = fromObject[key];
|
|
const toValue = toObject[key];
|
|
|
|
if (isArray(fromValue)) {
|
|
toObject[key] = copyArrayTo(fromValue, toValue);
|
|
} else if (isObject(fromValue)) {
|
|
toObject[key] = copyObjectTo(fromValue, toValue);
|
|
} else {
|
|
if (fromValue !== toValue) {
|
|
toObject[key] = fromValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
return toObject;
|
|
}
|
|
|
|
export function copyArrayTo(fromArray, toArray) {
|
|
if (!isArray(fromArray)) {
|
|
return toArray;
|
|
}
|
|
|
|
if (!isArray(toArray)) {
|
|
toArray = [];
|
|
}
|
|
|
|
for (let i = 0; i < fromArray.length; i++) {
|
|
const fromValue = fromArray[i];
|
|
|
|
if (toArray.length > i) {
|
|
const toValue = toArray[i];
|
|
|
|
if (isArray(fromValue)) {
|
|
toArray[i] = copyArrayTo(fromValue, toValue);
|
|
} else if (isObject(fromValue)) {
|
|
toArray[i] = copyObjectTo(fromValue, toValue);
|
|
} else {
|
|
if (fromValue !== toValue) {
|
|
toArray[i] = fromValue;
|
|
}
|
|
}
|
|
} else {
|
|
if (isArray(fromValue)) {
|
|
toArray.push(copyArrayTo(fromValue, []));
|
|
} else if (isObject(fromValue)) {
|
|
toArray.push(copyObjectTo(fromValue, {}));
|
|
} else {
|
|
toArray.push(fromValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
return toArray;
|
|
}
|
|
|
|
export function arrangeArrayWithNewStartIndex(array, startIndex) {
|
|
if (startIndex <= 0 || startIndex >= array.length) {
|
|
return array;
|
|
}
|
|
|
|
const newArray = [];
|
|
|
|
for (let i = startIndex; i < array.length; i++) {
|
|
newArray.push(array[i]);
|
|
}
|
|
|
|
for (let i = 0; i < startIndex; i++) {
|
|
newArray.push(array[i]);
|
|
}
|
|
|
|
return newArray;
|
|
}
|