Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript sort array by multiple (number) fields

How can I implement a

 ORDER BY sort1 DESC, sort2 DESC 

logic in an JSON array like such:

    var items = '[           {             "sort1": 1,             "sort2": 3,             "name" : "a",           },           {             "sort1": 1,             "sort2": 2,             "name" : "b",           },           {             "sort1": 2,             "sort2": 1,             "name" : "c",           }     ]'; 

resulting in the new order :

b,a,c 
like image 908
coiso Avatar asked Nov 03 '12 17:11

coiso


1 Answers

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);
like image 180
raina77ow Avatar answered Sep 17 '22 19:09

raina77ow