arr-helper-functions
Version:
Misc. functions for finding elements in arrays, sorting, and more
191 lines (183 loc) • 5.05 kB
JavaScript
// src/modules/conditions.ts
function not(condition) {
return condition === false;
}
// src/modules/find.ts
function isInArray(element, array) {
return array.includes(element);
}
function isNotInArray(element, array) {
return not(isInArray(element, array));
}
function areInArray(elements, array) {
return elements.every((d) => isInArray(d, array));
}
function isInAnyArray(element, arrays) {
return arrays.some((array) => isInArray(element, array));
}
function areInAnyArray(items, arrays) {
return items.every((item) => isInAnyArray(item, arrays));
}
function areInSameArray(items, arrays) {
return arrays.some((array) => areInArray(items, array));
}
// src/modules/conversion.ts
function arrayOfObjectsToObject(array, indexGetter, valueGetter) {
function getIndex(d) {
if (typeof indexGetter === "string") {
return d[indexGetter];
}
const indexValue = indexGetter(d);
if (typeof indexValue !== "string") {
throw new Error("A string should be returned for indexing");
} else {
return indexValue;
}
}
function getValue(d) {
if (valueGetter == null) {
return d;
}
if (typeof valueGetter === "string") {
return d[valueGetter];
}
return valueGetter(d);
}
return array.reduce((agg, item) => {
agg[getIndex(item)] = getValue(item);
return agg;
}, {});
}
// src/modules/fastFind.ts
var FastArraySearcher = class {
/**
* Creates an instance of FastArraySearcher.
* @param {ArrayOfObjects} arrayToSearch Array to search
* @param {(string | IndexerFunction)} options.indexGetter Property or item to use as index. Must resolve to a string
* @param {(string | AccessorFunction)} [options.valueGetter] Property or item to use as value (will be returned if found)
* @param {boolean} [options.keepOriginal=false] Whether to keeo original array reference inside
* @memberof FastArraySearcher
*/
constructor(arrayToSearch, options) {
this.originalArray = options.keepOriginal ? arrayToSearch : [];
this.searchObject = arrayOfObjectsToObject(
arrayToSearch,
options.indexGetter,
options.valueGetter
);
}
/**
* Finds element in array
*
* @param {string} element The element to search for
* @return {(any|undefined)} The found item, if found
* @memberof FastArraySearcher
*/
find(element) {
return this.searchObject[element];
}
};
// src/modules/unique.ts
function distinctValues(array, property) {
let arrayToFindDistinctOf = array;
if (property != null) {
const mapper = typeof property === "function" ? property : (d) => d[property];
arrayToFindDistinctOf = array.map(mapper);
}
return [...new Set(arrayToFindDistinctOf)];
}
// src/modules/filter.ts
function filterFalsyValues(array, includeZeros = false) {
const falsyValues = [false, null, void 0];
function conditionChecker(d) {
if (falsyValues.includes(d)) {
return false;
}
return includeZeros ? d !== 0 : true;
}
return array.filter(conditionChecker);
}
// src/modules/sort.ts
import { countArrayTypes } from "array-types-counter";
var SortingFunction = class {
/**
* Creates an instance of SortingFunction.
* @param {('number' | 'string')} sortType
* @param {(CompareFn<string> | CompareFn<number>)} sortFunc
* @memberof SortingFunction
*/
constructor(sortType, sortFunc) {
this.sortType = sortType;
this.sortFunc = sortFunc;
}
};
function getBestSortingFunction(array) {
var _a;
const typesCount = countArrayTypes(array);
function numberSort(a, b) {
return a - b;
}
if (((_a = typesCount[0]) == null ? void 0 : _a.type) === "number") {
return new SortingFunction("number", numberSort);
}
return new SortingFunction("string", Intl.Collator().compare);
}
var ArraySorter = class {
/**
* Creates an instance of ArraySorter.
* @param {any[]} array
* @memberof ArraySorter
*/
constructor(array) {
this.arrayToSort = array;
}
/**
* Sorts array
*
* @return {any[])}
* @memberof ArraySorter
*/
sort() {
const { sortType, sortFunc } = getBestSortingFunction(this.arrayToSort);
if (sortType === "string") {
const arrCopy2 = [...this.arrayToSort];
const sortingFunc2 = sortFunc;
return arrCopy2.sort(sortingFunc2);
}
const arrCopy = [...this.arrayToSort];
const sortingFunc = sortFunc;
return arrCopy.sort(sortingFunc);
}
};
function sortArray(array) {
const sorter = new ArraySorter(array);
return sorter.sort();
}
function getFirstAndLastElement(array) {
return [array[0], array[array.length - 1]];
}
// src/modules/content.ts
function isEmpty(array) {
return array.length === 0;
}
function isNotEmpty(array) {
return not(isEmpty(array));
}
export {
ArraySorter,
FastArraySearcher,
SortingFunction,
areInAnyArray,
areInArray,
areInSameArray,
distinctValues,
filterFalsyValues,
getBestSortingFunction,
getFirstAndLastElement,
isEmpty,
isInAnyArray,
isInArray,
isNotEmpty,
isNotInArray,
sortArray
};