8

I have an array MyArrayOfItems of Item objects with objects that look like this:

Item
{
  ContainerID: i, // int
  ContainerName: 'SomeName', // string
  ItemID: j, // int
  ItemName: 'SomeOtherName' // string
}

I want to sort this array so that it's sorted by ContainerID and then by ItemName alphabetically.

I have a custom sort function that so far looks like this:

function CustomSort(a, b) {

  Item1 = a['ContainerID'];
  Item2 = b['ContainerID'];

  return Item1 - Item2;
}

MyArrayOfItems.sort(CustomSort);

This sorts by ContainerID but how do I then sort by ItemName?

Thanks.

3
  • possible duplicate of Javascript sort array by two fields Commented May 1, 2012 at 20:23
  • @FelixKling: not really; I need it to sort alphabetically. Commented May 1, 2012 at 20:25
  • So? You can easily compare stings with < and > though I agree that localCompare is a better way. I thought the overall question was about how to sort by two properties, in which case it is clearly a duplicate. Commented May 1, 2012 at 21:28

3 Answers 3

6

Use String.localeCompare function. And use it when ContainerID of a and b are equal.

function CustomSort(a, b) {
  var Item1 = a['ContainerID'];
  var Item2 = b['ContainerID'];
  if(Item1 != Item2){
      return (Item1 - Item2);
  }
  else{
      return (a.ItemName.localeCompare(b.ItemName));
  }
}

To tweak the sorting order you can always put - in front of any return expression.

Sign up to request clarification or add additional context in comments.

4 Comments

It should. As its in JavaScript 1.2 which is very old.
localcompare is a good choice, but as I remember chrome had issues with it..code.google.com/p/v8/issues/detail?id=459
Item1 - Item2 !=0 can be simplified to Item1 != Item2.
ok, thanks Felix; I put Item1 !== Item2 to use the triple comparator.
5
function CustomSort(a, b) {

  Item1 = a['ContainerID'];
  Item2 = b['ContainerID'];
  if(Item1 - Item2 !=0){
      return Item1 - Item2;
  }
  else{
      if (a.ItemName < b.ItemName)
         return -1;
      if (a.ItemName > b.ItemName)
         return 1;
      return 0;
  }
}

1 Comment

ok, thanks; upvoted because it also works. I prefer localeCompare though.
0

A nice simplification of this is:

function CustomSort(a, b) {
  var Item1 = a['ContainerID'];
  var Item2 = b['ContainerID'];
  

 if(Item1 != Item2){
      return (Item1 - Item2);
  }
  else{
      return (a.ItemName.localeCompare(b.ItemName));
  }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.