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));