JavaScript sort array by multiple (number) fields
You should design your sorting function accordingly:
items.sort(function(a, b) { return a.sort1 - b.sort1 || a.sort2 - b.sort2;});
(because ||
operator has lower precedence than -
one, it's not necessary to use parenthesis here).
The logic is simple: if a.sort1 - b.sort1
expression evaluates to 0 (so these properties are equal), it will proceed with evaluating ||
expression - and return the result of a.sort2 - b.sort2
.
As a sidenote, your items
is actually a string literal, you have to JSON.parse
to get an array:
const itemsStr = `[{ "sort1": 1, "sort2": 3, "name": "a" }, { "sort1": 1, "sort2": 2, "name": "b" }, { "sort1": 2, "sort2": 1, "name": "c" }]`;const items = JSON.parse(itemsStr);items.sort((a, b) => a.sort1 - b.sort1 || a.sort2 - b.sort2);console.log(items);
You can avoid hardcoding by create a general function
function sortByMultipleKey(keys) { return function(a, b) { if (keys.length == 0) return 0; // force to equal if keys run out key = keys[0]; // take out the first key if (a[key] < b[key]) return -1; // will be 1 if DESC else if (a[key] > b[key]) return 1; // will be -1 if DESC else return sortByMultipleKey(keys.slice(1))(a, b); }}
Running
items.sort(sortByMultipleKey(['sort1', 'sort2']));
will have you
[ { sort1: 1, sort2: 2, name: 'b' }, { sort1: 1, sort2: 3, name: 'a' }, { sort1: 2, sort2: 1, name: 'c' } ]
const itemsStr = `[{ "sort1": 1, "sort2": 3, "name": "a" }, { "sort1": 1, "sort2": 2, "name": "b" }, { "sort1": 2, "sort2": 1, "name": "c" }]`;const items = JSON.parse(itemsStr);items.sort((a, b) => a.sort1 - b.sort1 || a.sort2 - b.sort2);console.log(items);