UNPKG

@churchapps/helpers

Version:

Library of helper functions not specific to any one ChurchApps project or framework.

158 lines (139 loc) 5.33 kB
import { UniqueIdHelper } from "./UniqueIdHelper"; export class ArrayHelper { static getIds(array: any[], propertyName: string) { const result: string[] = []; for (const item of array) { const id = item[propertyName]?.toString(); if (!UniqueIdHelper.isMissing(id) && result.indexOf(id) === -1) result.push(id); } return result; } static sortBy(array: any[], propertyName: string, descending: boolean = false) { array.sort((a, b) => { const valA = a[propertyName]; const valB = b[propertyName]; if (valA < valB) return descending ? 1 : -1; else return descending ? -1 : 1; }); } static getIndex(array: any[], propertyName: string, value: any) { for (let i = 0; i < array.length; i++) { const item = array[i]; if (ArrayHelper.compare(item, propertyName, value)) return i; } return -1; } static getOne(array: any[], propertyName: string, value: any) { for (const item of array || []) if (ArrayHelper.compare(item, propertyName, value)) return item; return null } static getAll(array: any[], propertyName: string, value: any) { const result: any[] = [] for (const item of array || []) { if (ArrayHelper.compare(item, propertyName, value)) result.push(item); } return result; } static getAllArray(array: any[], propertyName: string, values: any[]) { const result: any[] = [] for (const item of array || []) if (values.indexOf(item[propertyName]) > -1) result.push(item); return result; } private static compare(item: any, propertyName: string, value: any) { const propChain = propertyName.split("."); if (propChain.length === 1) return item[propertyName] === value; else { let obj = item; for (let i = 0; i < propChain.length - 1; i++) { if (obj && obj[propChain[i]] !== undefined) obj = obj[propChain[i]]; else return false; } return obj[propChain[propChain.length - 1]] === value; } } static getUniqueValues(array: any[], propertyName: string) { const result: any[] = []; for (const item of array) { const val = (propertyName.indexOf(".") === -1) ? item[propertyName] : this.getDeepValue(item, propertyName) if (result.indexOf(val) === -1) result.push(val); } return result; } static getUnique(array: any[]) { const result: any[] = [] const jsonList: string[] = []; for (const item of array) { const json = JSON.stringify(item); if (jsonList.indexOf(json) === -1) { result.push(item); jsonList.push(json); } } return result; } static getAllOperatorArray(array: any[], propertyName: string, values: any[], operator: string, dataType = "string") { const result: any[] = []; values.forEach(v => { const filtered = this.getAllOperator(array, propertyName, v, operator.replace("notIn", "notEqual").replace("in", "equals").replace("donatedToAny", "equals").replace("donatedTo", "equals").replace("attendedCampus", "equals").replace("attendedAny", "equals").replace("attendedServiceTime", "equals").replace("attendedService", "equals").replace("attendedGroup", "equals"), dataType); filtered.forEach(f => result.push(f)); }) return result; } static getAllOperator(array: any[], propertyName: string, value: any, operator: string, dataType = "string") { const result: any[] = [] for (const item of array) { let propVal = item[propertyName] || ""; let compVal = value || ""; if (dataType === "number") { propVal = parseFloat(propVal); compVal = parseFloat(compVal); } else if (dataType === "string") { propVal = propVal.toLowerCase(); compVal = compVal.toLowerCase(); } switch (operator) { case "equals": if (propVal === compVal) result.push(item); break; case "startsWith": if (propVal.indexOf(compVal) === 0) result.push(item); break; case "endsWith": if (propVal.indexOf(compVal) === propVal.length - compVal.length) result.push(item); break; case "contains": if (propVal.indexOf(compVal) > -1) result.push(item); break; case "greaterThan": if (propVal > compVal) result.push(item); break; case "greaterThanEqual": if (propVal >= compVal) result.push(item); break; case "lessThan": if (propVal < compVal) result.push(item); break; case "lessThanEqual": if (propVal <= compVal) result.push(item); break; case "notEqual": if (propVal !== compVal) result.push(item); break; } } return result; } static getDeepValue(item: any, propertyName: string) { const propertyNames = propertyName.split("."); let result: any = item; propertyNames.forEach(name => { result = result[name]; }); return result; } static fillArray(contents: string, length: number) { const result = []; for (let i = 0; i < length; i++) result.push(contents); return result; } }