Skip to content

Commit

Permalink
More refactoring for Codacy (#1739)
Browse files Browse the repository at this point in the history
  • Loading branch information
alansemenov committed Feb 10, 2021
1 parent 3bff9ea commit 0f64e09
Showing 1 changed file with 107 additions and 121 deletions.
228 changes: 107 additions & 121 deletions src/main/resources/assets/admin/common/js/ObjectHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,182 +49,168 @@ export class ObjectHelper {
return true;
}

static baseEquals(a: any, b: any): boolean {
if (!a && !b) {
static isDefined(val: any): boolean {
return val !== undefined && val !== null;
}

static bothDefined(val1: any, val2: any): boolean {
return ObjectHelper.isDefined(val1) && ObjectHelper.isDefined(val2);
}

static noneDefined(val1: any, val2: any): boolean {
return !ObjectHelper.isDefined(val1) && !ObjectHelper.isDefined(val2);
}

static equallyDefined(a: any, b: any): boolean {
if (ObjectHelper.noneDefined(a, b) || ObjectHelper.bothDefined(a, b)) {
return true;
} else if (!a || !b) {
return false;
}

return undefined;
return false;
}

static equals(a: Equitable, b: Equitable): boolean {
const result = ObjectHelper.baseEquals(a, b);
if (typeof result === 'boolean') {
return result;
}

return a.equals(b);
return ObjectHelper.bothDefined(a, b) ? a.equals(b) : ObjectHelper.equallyDefined(a, b);
}

static arrayEquals(arrayA: Equitable[], arrayB: Equitable[]): boolean {
return ObjectHelper.arrayEquals(arrayA, arrayB);
return ObjectHelper.anyArrayEquals(arrayA, arrayB);
}

static anyArrayEquals(arrayA: any[], arrayB: any[]) {
const result = ObjectHelper.baseEquals(arrayA, arrayB);
if (typeof result === 'boolean') {
return result;
}
static anyArrayEquals(arrayA: any[], arrayB: any[]): boolean {
if (ObjectHelper.bothDefined(arrayA, arrayB)) {

if (arrayA.length !== arrayB.length) {
return false;
}

for (let i = 0; i < arrayA.length; i++) {
if (!ObjectHelper.objectEquals(arrayA[i], arrayB[i])) {
if (arrayA.length !== arrayB.length) {
return false;
}

for (let i = 0; i < arrayA.length; i++) {
if (!ObjectHelper.objectEquals(arrayA[i], arrayB[i])) {
return false;
}
}
}

return true;
return ObjectHelper.equallyDefined(arrayA, arrayB);
}

static objectMapEquals(mapA: { [s: string]: Equitable; }, mapB: { [s: string]: Equitable; }) {
const result = ObjectHelper.baseEquals(mapA, mapB);
if (typeof result === 'boolean') {
return result;
}
static objectMapEquals(mapA: { [s: string]: Equitable; }, mapB: { [s: string]: Equitable; }): boolean {
if (ObjectHelper.bothDefined(mapA, mapB)) {

// Gather keys for both maps
const keysA: string[] = [];
for (const keyA in mapA) {
if (mapA.hasOwnProperty(keyA)) {
keysA.push(keyA);
// Gather keys for both maps
const keysA: string[] = [];
for (const keyA in mapA) {
if (mapA.hasOwnProperty(keyA)) {
keysA.push(keyA);
}
}
}
const keysB: string[] = [];
for (const keyB in mapB) {
if (mapB.hasOwnProperty(keyB)) {
keysB.push(keyB);
const keysB: string[] = [];
for (const keyB in mapB) {
if (mapB.hasOwnProperty(keyB)) {
keysB.push(keyB);
}
}
}

if (!ObjectHelper.stringArrayEquals(keysA.sort(), keysB.sort())) {
return false;
}

return keysA.every((curKeyA: string) => {
const valueA: Equitable = mapA[curKeyA];
const valueB: Equitable = mapB[curKeyA];
if (!ObjectHelper.stringArrayEquals(keysA.sort(), keysB.sort())) {
return false;
}

return ObjectHelper.equals(valueA, valueB);
});
}
return keysA.every((curKeyA: string) => {
const valueA: Equitable = mapA[curKeyA];
const valueB: Equitable = mapB[curKeyA];

static stringEquals(a: string, b: string) {
const result = ObjectHelper.baseEquals(a, b);
if (typeof result === 'boolean') {
return result;
return ObjectHelper.equals(valueA, valueB);
});
}

return a.toString() === b.toString();
return ObjectHelper.equallyDefined(mapA, mapB);
}

static stringArrayEquals(arrayA: string[], arrayB: string[]) {
const result = ObjectHelper.baseEquals(arrayA, arrayB);
if (typeof result === 'boolean') {
return result;
}

if (arrayA.length !== arrayB.length) {
return false;
}
static stringEquals(a: string, b: string): boolean {
return ObjectHelper.bothDefined(a, b) ? a.toString() === b.toString() : ObjectHelper.equallyDefined(a, b);
}

for (let i = 0; i < arrayA.length; i++) {
if (!ObjectHelper.stringEquals(arrayA[i], arrayB[i])) {
static stringArrayEquals(arrayA: string[], arrayB: string[]): boolean {
if (ObjectHelper.bothDefined(arrayA, arrayB)) {
if (arrayA.length !== arrayB.length) {
return false;
}
}

return true;
}
for (let i = 0; i < arrayA.length; i++) {
if (!ObjectHelper.stringEquals(arrayA[i], arrayB[i])) {
return false;
}
}

static booleanEquals(a: boolean, b: boolean) {
const result = ObjectHelper.baseEquals(a, b);
if (typeof result === 'boolean') {
return result;
return true;
}

return a === b;
return ObjectHelper.equallyDefined(arrayA, arrayB);
}

static booleanEquals(a: boolean, b: boolean): boolean {
return ObjectHelper.bothDefined(a, b) ? a === b : ObjectHelper.equallyDefined(a, b);
}

/*
* Keep in mind that !0 is true as well as !null
*/
static numberEquals(a: number, b: number) {
static numberEquals(a: number, b: number): boolean {
if (ObjectHelper.bothDefined(a, b)) {
return NumberHelper.isNumber(a) && NumberHelper.isNumber(b) && a === b;
}

return NumberHelper.isNumber(a) && NumberHelper.isNumber(b) && a === b;
}

static dateEquals(a: Date, b: Date) {
const result = ObjectHelper.baseEquals(a, b);
if (typeof result === 'boolean') {
return result;
}

return a.toISOString() === b.toISOString();
static dateEquals(a: Date, b: Date): boolean {
return ObjectHelper.bothDefined(a, b) ? a.toISOString() === b.toISOString() : ObjectHelper.equallyDefined(a, b);
}

static dateEqualsUpToMinutes(a: Date, b: Date) {
const result = ObjectHelper.baseEquals(a, b);
if (typeof result === 'boolean') {
return result;
}
static dateEqualsUpToMinutes(a: Date, b: Date): boolean {
if (ObjectHelper.bothDefined(a, b)) {

const clonedA = new Date(a.getTime());
a.setSeconds(0, 0);
const clonedB = new Date(b.getTime());
b.setSeconds(0, 0);
const clonedA = new Date(a.getTime());
a.setSeconds(0, 0);
const clonedB = new Date(b.getTime());
b.setSeconds(0, 0);

return clonedA.toISOString() === clonedB.toISOString();
}

static anyEquals(a: any, b: any) {
const result = ObjectHelper.baseEquals(a, b);
if (typeof result === 'boolean') {
return result;
return ObjectHelper.dateEquals(clonedA, clonedB);
}

return JSON.stringify(a) === JSON.stringify(b);
return ObjectHelper.equallyDefined(a, b);
}

static objectEquals(a: Object, b: Object) {
const result = ObjectHelper.baseEquals(a, b);
if (typeof result === 'boolean') {
return result;
}
static anyEquals(a: any, b: any): boolean {
return ObjectHelper.bothDefined(a, b) ? JSON.stringify(a) === JSON.stringify(b) : ObjectHelper.equallyDefined(a, b);
}

if (a === b) {
return true;
}
static objectEquals(a: Object, b: Object): boolean {
if (ObjectHelper.bothDefined(a, b)) {

if (ClassHelper.getClassName(a) !== ClassHelper.getClassName(b)) {
return false;
}
if (a === b) {
return true;
}

if (ClassHelper.getClassName(a) !== ClassHelper.getClassName(b)) {
return false;
}

/*
To avoid exception, when converting circular structure to JSON in Chrome the replacer
function must be used to replace references to the same object with `undefined`.
*/
let aString = JSON.stringify(a, (key, value) => {
return (!!key && a === value) ? undefined : value;
});
let bString = JSON.stringify(b, (key, value) => {
return (!!key && b === value) ? undefined : value;
});
return aString === bString;
/*
To avoid exception, when converting circular structure to JSON in Chrome the replacer
function must be used to replace references to the same object with `undefined`.
*/
let aString = JSON.stringify(a, (key, value) => {
return (!!key && a === value) ? undefined : value;
});
let bString = JSON.stringify(b, (key, value) => {
return (!!key && b === value) ? undefined : value;
});
return aString === bString;
}

return ObjectHelper.equallyDefined(a, b);
}

static objectPropertyIterator(object: any, callback: { (name: string, property: any, index?: number): void; }) {
Expand All @@ -238,7 +224,7 @@ export class ObjectHelper {
}
}

static propertyExists(object: Object, key: string) {
static propertyExists(object: Object, key: string): boolean {
return !!object && object.hasOwnProperty(key) && !!object[key];
}
}

0 comments on commit 0f64e09

Please sign in to comment.