uicore-ts
Version:
UICore is a library to build native-like user interfaces using pure Typescript. No HTML is needed at all. Components are described as TS classes and all user interactions are handled explicitly. This library is strongly inspired by the UIKit framework tha
75 lines (74 loc) • 2.6 kB
JavaScript
;
onmessage = function(event) {
const workerResult = sortData(
event.data.data,
event.data.sortingInstructions
);
workerResult.identifier = event.data.identifier;
workerResult.instanceIdentifier = event.data.instanceIdentifier;
postMessage(workerResult);
};
function valueForKeyPath(keyPath, object) {
var keys = keyPath.split(".");
var currentObject = object;
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (key.substring(0, 2) == "[]") {
currentObject = currentObject[key.substring(2)];
var remainingKeyPath = keys.slice(i + 1).join(".");
var currentArray = currentObject;
currentObject = currentArray.map(function(subObject, index, array) {
var result = valueForKeyPath(remainingKeyPath, subObject);
return result;
});
break;
}
currentObject = (currentObject || {})[key];
}
return currentObject;
}
function compare(firstObject, secondObject, sortingInstructions) {
if (sortingInstructions.length == 0) {
return 0;
}
const sortingInstruction = sortingInstructions[0];
let directionMultiplier = 1;
if (sortingInstruction.direction == "descending") {
directionMultiplier = -1;
}
const firstDataString = firstObject[sortingInstruction.keyPath];
const secondDataString = secondObject[sortingInstruction.keyPath];
if (firstDataString < secondDataString) {
return -1 * directionMultiplier;
}
if (firstDataString > secondDataString) {
return directionMultiplier;
}
if (sortingInstructions.length > 1) {
const remainingSortingInstructions = sortingInstructions.slice(1);
return compare(firstObject, secondObject, remainingSortingInstructions);
}
return 0;
}
function sortData(data, sortingInstructions) {
const sortingObjects = data.map(function(dataItem, index, array) {
const result = {
"_UIKeyValueStringSorterWebWorkerSortingObjectIndex": index
};
sortingInstructions.forEach((instruction) => {
result[instruction.keyPath] = JSON.stringify(valueForKeyPath("" + instruction.keyPath, dataItem) || {}).toLowerCase();
});
return result;
});
const sortedData = sortingObjects.sort((firstObject, secondObject) => compare(
firstObject,
secondObject,
sortingInstructions
));
const sortedIndexes = sortedData.map((object) => object._UIKeyValueStringSorterWebWorkerSortingObjectIndex);
return {
"sortedData": sortedIndexes.map((sortedIndex) => data[sortedIndex]),
"sortedIndexes": sortedIndexes
};
}
//# sourceMappingURL=UIKeyValueStringSorterWebWorker.worker.js.map