dbm
Version:
528 lines (407 loc) • 14 kB
JavaScript
import Dbm from "../index.js";
export const range = function(aStartValue, aEndValue, aStepValue = 1, aIncludeEndValue = true) {
let returnArray = new Array();
let loopCompare;
if(aStepValue > 0) {
if(aIncludeEndValue) {
loopCompare = function(aIndex, aLimit) {
return aIndex <= aLimit;
};
}
else {
loopCompare = function(aIndex, aLimit) {
return aIndex < aLimit;
};
}
}
else {
if(aIncludeEndValue) {
loopCompare = function(aIndex, aLimit) {
return aIndex >= aLimit;
};
}
else {
loopCompare = function(aIndex, aLimit) {
return aIndex > aLimit;
};
}
}
for(let i = aStartValue; loopCompare(i, aEndValue); i += aStepValue) {
returnArray.push(i);
}
return returnArray;
}
export const removeDuplicates = function(aArray) {
let returnArray = [];
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentValue = currentArray[i];
if(returnArray.indexOf(currentValue) === -1) {
returnArray.push(currentValue);
}
}
return returnArray;
}
export const singleOrArray = function(aData) {
if(aData === null || aData === undefined) {
return [];
}
else if(aData instanceof Array) {
return aData;
}
return [aData];
}
export const removeValues = function(aArray, aRemoveValues) {
let returnArray = new Array();
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentValue = currentArray[i];
if(aRemoveValues.indexOf(currentValue) === -1) {
returnArray.push(currentValue);
}
}
return returnArray;
}
export const trimArray = function(aArray, aMode = 3) {
if(aMode > 0) {
//METODO: use mode
if(aArray) {
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentString = currentArray[i];
if(typeof(currentString) === "string") {
currentArray[i] = currentString.trim();
}
}
}
}
return aArray;
}
export const arrayOrSeparatedString = function(aData, aSeparator = ",", aTrim = 3) {
if(aData === null || aData === undefined) {
return [];
}
else if(aData instanceof Array) {
return aData;
}
else if(typeof(aData) === "string") {
if(aData === "") {
return [];
}
return trimArray(aData.split(aSeparator));
}
console.error(aData + " is not array or string.");
return [];
}
export const numericArrayOrSeparatedString = function(aData, aSeparator = ",", aTrim = 3) {
let returnArray = new Array();
let currentArray = arrayOrSeparatedString(aData, aSeparator, aTrim);
let currentarrayLength = currentArray.length;
for(let i = 0; i < currentarrayLength; i++) {
returnArray.push(parseFloat(currentArray[i]));
}
return returnArray;
}
export const filterByField = function(aArray, aField, aValue, aCompareFunction = "==") {
if(!aArray) {
return [];
}
let compareFunction;
if(typeof(aCompareFunction) === "string") {
compareFunction = Dbm.getInstance().repository.getItem("compareFunctions/" + aCompareFunction).compare;
if(!compareFunction) {
console.warn("No copmare function registered for: " + aCompareFunction + ". Using ==", aArray, aField, aValue);
compareFunction = Dbm.utils.CompareFunctions.equals;
}
}
else if(typeof(aCompareFunction) === "function") {
compareFunction = aCompareFunction;
}
else {
console.warn("Unkonown copmare function. Using ==", aCompareFunction, aArray, aField, aValue);
compareFunction = Dbm.utils.CompareFunctions.equals;
}
let returnArray = [];
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentItem = aArray[i];
let currentValue = Dbm.objectPath(aArray[i], aField);
if(compareFunction(currentValue, aValue)) {
returnArray.push(currentItem);
}
}
return returnArray;
}
export const mapField = function(aArray, aField) {
let currentArray = aArray;
let currentArrayLength = currentArray.length;
let returnArray = new Array(currentArrayLength);
for(let i = 0; i < currentArrayLength; i++) {
returnArray[i] = Dbm.objectPath(aArray[i], aField);
}
return returnArray;
}
export const group = function(aArray, aField) {
let groups = new Map();
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentObject = aArray[i];
let groupValue = Dbm.objectPath(currentObject, aField);
if(!groups.has(groupValue)) {
groups.set(groupValue, []);
}
groups.get(groupValue).push(currentObject);
}
let returnArray = [];
for (const value of groups.entries()) {
returnArray.push({"key": value[0], "value": value[1]});
}
return returnArray;
}
export const groupOnMultipleFields = function(aArray, aFields, aSeparator = "-") {
let groups = new Map();
let currentArray2 = aFields;
let currentArray2Length = currentArray2.length;
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentObject = aArray[i];
let groupValues = [];
for(let j = 0; j < currentArray2Length; j++) {
groupValues.push(Dbm.objectPath(currentObject, currentArray2[j]));
}
let groupValue = groupValues.join(aSeparator);
if(!groups.has(groupValue)) {
groups.set(groupValue, []);
}
groups.get(groupValue).push(currentObject);
}
let returnArray = [];
for (const value of groups.entries()) {
returnArray.push({"key": value[0], "value": value[1]});
}
return returnArray;
}
export const makeFlat = function(aArray) {
let returnArray = [];
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
returnArray = returnArray.concat(currentArray[i]);
}
return returnArray;
}
export const getUnselectedItems = function(aSelectedItems, aAllItems) {
let returnItems = new Array();
let currentArray = aAllItems;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentItem = currentArray[i];
if(aSelectedItems.indexOf(currentItem) === -1) {
returnItems.push(currentItem);
}
}
return returnItems;
}
const defaultCompareFunction = function (aA, aB) {
if(aA < aB) {
return -1;
}
else if(aA > aB) {
return 1;
}
return 0;
}
export const sortOnField = function(aArray, aField, aCompareFunction = null) {
let compareFunction = aCompareFunction;
if(!compareFunction) {
compareFunction = defaultCompareFunction;
}
let sortFunction = function(aA, aB) {
let aValue = Dbm.objectPath(aA, aField);
let bValue = Dbm.objectPath(aB, aField);
return compareFunction(aValue, bValue);
}
aArray.sort(sortFunction);
return aArray;
}
export const sortOnNumericField = function(aArray, aField) {
let compareFunction = function(aA, aB) {
let aValue = 1*aA;
let bValue = 1*aB;
if(aValue < bValue) {
return -1;
}
else if(aValue > bValue) {
return 1;
}
return 0;
}
return sortOnField(aArray, aField, compareFunction);
}
export const getInOrder = function(aArray, aOrderIndexes) {
let currentArray = aOrderIndexes;
let currentArrayLength = currentArray.length;
let returnArray = new Array(currentArrayLength);
for(let i = 0; i < currentArrayLength; i++) {
returnArray[i] = aArray[currentArray[i]];
}
return returnArray;
}
export const naturalSortOnField = function(aArray, aField, aLanguageCode = null) {
if(!aLanguageCode) {
aLanguageCode = Dbm.getRepositoryItem("site").currentLanguageCode;
}
let compareObject = new Intl.Collator(aLanguageCode, { numeric: true, sensitivity: 'base' });
let compareFunction = function(aA, aB) {
if(!aA && !aB) return 0;
if(!aA) return 1;
if(!aB) return -1;
let result = compareObject.compare(aA, aB);
return result;
}
return sortOnField(aArray, aField, compareFunction)
}
export const getItemIndexByIfExists = function(aArray, aField, aIdentifier) {
if(!Array.isArray(aArray)) {
console.warn("No array provided", aArray);
return -1;
}
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentItem = currentArray[i];
let currentValue = Dbm.objectPath(currentItem, aField);
if(currentValue == aIdentifier) {
return i;
}
}
return -1;
}
export const getItemByIfExists = function(aArray, aField, aIdentifier) {
let index = getItemIndexByIfExists(aArray, aField, aIdentifier);
return (index !== -1) ? aArray[index] : null;
}
export const getItemBy = function(aArray, aField, aIdentifier) {
let index = getItemIndexByIfExists(aArray, aField, aIdentifier);
if(index === -1) {
console.warn("No item found", aArray, aField, aIdentifier);
}
return (index !== -1) ? aArray[index] : null;
}
export const sum = function(aArray) {
if(!Array.isArray(aArray)) {
console.warn("No array provided", aArray);
return 0;
}
let sum = 0;
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentValue = 1*currentArray[i];
if(!isNaN(currentValue)) {
sum += currentValue;
}
}
return sum;
}
export const stepFromCenter = function(aStep, aLength) {
let halfPoint = (aLength-1)/2;
let startIndex = Math.ceil(halfPoint);
let direction = (startIndex > halfPoint) ? -1 : 1;
let step = Math.ceil(aStep/2);
let swing = (aStep%2)*2-1;
let index = startIndex + step * (swing * direction);
return index;
}
export const scoreItems = function(aArray, aScoreFunction) {
let returnArray = [];
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let item = currentArray[i];
returnArray.push({"key": item, "value": aScoreFunction(item)});
}
sortOnField(returnArray, "value");
return returnArray;
}
export const splitArray = function(aArray, aGroupSize) {
let returnArray = [];
let currentGroup = null;
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
if(i % aGroupSize === 0) {
currentGroup = [];
returnArray.push(currentGroup);
}
currentGroup.push(currentArray[i]);
}
return returnArray;
}
export const mapArrayToObject = function(aArray, aKeyField, aDataField = null, aKeyPrefix = "") {
let returnObject = {};
let currentArray = aArray;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentArrayEntry = currentArray[i];
let key = aKeyPrefix + Dbm.objectPath(currentArrayEntry, aKeyField);
let data = aDataField ? Dbm.objectPath(currentArrayEntry, aDataField) : currentArrayEntry;
returnObject[key] = data;
}
return returnObject;
}
export const mapObjectToArray = function(aObject, aKeyField, aDataField = null, aKeyPrefix = "") {
let returnArray = [];
for(let objectName in aObject) {
let currentEntry = aObject[objectName];
let newObject = {};
if(aDataField !== null) {
newObject[aDataField] = currentEntry;
}
else {
for(let objectName2 in currentEntry) {
newObject[objectName2] = currentEntry[objectName2];
}
}
if(aKeyField) {
newObject[aKeyField] = objectName.substring(aKeyPrefix.length, objectName.length);
}
returnArray.push(newObject);
}
return returnArray;
}
export const mapObjectToArrayWithoutKey = function(aObject) {
let returnArray = [];
for(let objectName in aObject) {
returnArray.push(aObject[objectName]);
}
return returnArray;
}
export const anyOverlap = function(aArray1, aArray2) {
let currentArray = aArray1;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
if(aArray2.indexOf(currentArray[i]) !== -1) {
return true;
}
}
return false;
}
export const overlap = function(aArray1, aArray2) {
let returnArray = [];
let currentArray = aArray1;
let currentArrayLength = currentArray.length;
for(let i = 0; i < currentArrayLength; i++) {
let currentItem = currentArray[i];
if(aArray2.indexOf(currentItem) !== -1) {
returnArray.push(currentItem);
}
}
return returnArray;
}