This solution worked for me and handles strings, number, booleans, and dates.
import { get, orderBy } from "lodash";
const items = [
{ id: 1, firstName: null, enabled: true, age: 30 },
{ id: 2, enabled: true, age: 31 },
{ id: 3, firstName: "", enabled: true, age: null },
{ id: 4, firstName: "A", enabled: false, age: undefined },
{ id: 5, firstName: "a", enabled: null, age: 10 },
{ id: 6, firstName: "b", enabled: undefined, age: 11 }
];
const sortIterate = (item, property) => {
// Null will be returned for any undefined values
const value = get(item, property, null);
// If value is null set to empty string to get proper sort order
// Works if comparing against strings, numbers, booleans, and dates.
return value === null ? "" : value;
};
// Single sort example
const orderedArray = orderBy(
items,
[(item) => sortIterate(item, "firstName")],
["asc"]
);
// Multi sort example
const multiOrderedArray = orderBy(
items,
[
(item) => sortIterate(item, "firstName"),
(item) => sortIterate(item, "age")
],
["asc", "desc"]
);