JSFiddle - React, Tailwind, and code Playground
by tonytlwu
JavaScript
var e = false;
function compare(n, o) {
// Convert second elements to lowercase if they are strings
if (typeof n[1] === "string") {
n[1] = n[1].toLowerCase();
}
if (typeof o[1] === "string") {
o[1] = o[1].toLowerCase();
}
// Compare second elements based on sorting rules
if (n[1] === o[1]) {
return 0;
} else if (isEmpty(n[1])) {
return sortEmptyCells(n[1], o[1], e, 1);
} else if (isEmpty(o[1])) {
return sortEmptyCells(n[1], o[1], e, -1);
} else if (isNumber(n[1]) && !isNumber(o[1])) {
return e ? -1 : 1;
} else if (!isNumber(n[1]) && isNumber(o[1])) {
return e ? 1 : -1;
} else {
// Both elements are either numbers or non-empty strings
n[1] = parseNumber(n[1]);
o[1] = parseNumber(o[1]);
if (o[1] > n[1]) {
return e ? -1 : 1;
} else if (n[1] > o[1]) {
return e ? 1 : -1;
} else {
return 0;
}
}
}
function isEmpty(str) {
return str === "";
}
function isNumber(value) {
return !isNaN(parseFloat(value)) && isFinite(value);
}
function parseNumber(value) {
return isNumber(value) ? parseFloat(value) : value;
}
function sortEmptyCells(nValue, oValue, sortEmptyCells, sortOrder) {
return sortEmptyCells ? sortOrder : 0;
}
function stringify(value) {
if (typeof value === 'object' && value !== null) {
value = JSON.stringify(value);
}
if (value === -0) {
return 0;
}
if (Number.isNaN(value) || value === null) {
return undefined;
}
return value;
}
var arr = [true, false, -0, 0, 1, 10, 2, '-0', '0', '1', '10', '2', 'A3', 'A10', { a: 1 }, {}, undefined, null];
arr = arr.map(stringify);
console.log(arr.sort(compare));