1

I have an array with objects, and I want to sort them by name :

myArray = [{name: 'name10'}, {name: 'name9'}, {name: 'name1'}, {name: 'name3'}]

When I apply the sort method like this

myArray.sort((a, b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0));

it gives me 10 just after 1

myArray = [{name: 'name1'}, {name: 'name10'}, {name: 'name3'}, {name: 'name9'}]

Can I fix this ?

LoukasPap
  • 1,244
  • 1
  • 8
  • 17
Seb
  • 75
  • 1
  • 8

2 Answers2

2

You could take String#localeCompare with options.

const array = [{ name: 'name10' }, { name: 'name9' }, { name: 'name1' }, { name: 'name3' }];

array.sort(({ name: a }, { name: b }) =>
    a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' })
);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
1

If you want to sort the names by the number at the end:

myArray = [{name: 'name10'}, {name: 'name9'}, {name: 'name1'}, {name: 'name3'}]
myArray.sort((a,b) => {
     let aNumber = a.name.match(/\d+$/), bNumber = b.name.match(/\d+$/);
     if(aNumber && bNumber)
          return parseInt(aNumber[0]) - parseInt(bNumber[0]);
     else
          return a-b;
});
console.log(myArray);
Majed Badawi
  • 27,616
  • 4
  • 25
  • 48