Anindyo Bose
Anindyo Bose

Reputation: 183

Angular Object Array Sorting

Trying to sort the array of object, the property of the object contains alphanumeric values, Tried methods which didn't worked

test.sort((a,b)=> a.Code.localeCompare(b.Code)); test.sort((a,b)=> +a.Code- +b.Code);

let test = [{Code: '16', Color: "Red"},
      {Code: '54', Color: "Yellow"},
      {Code: '24', Color: "Yellow"},
      {Code: '1600', Color: "Blue"},
      {Code: '16a', Color: "Green"},
      {Code: '22', Color: "Yellow"},
      {Code: '23', Color: "Yellow"}];

 test.sort((a,b) =>  a.Code.localeCompare(b.Code));
 console.log(test);

getting output as

[{"Code": "16", "Color": "Red" },
{"Code": "1600","Color": "Blue"},
{"Code": "16a","Color": "Green"},
{"Code": "22","Color": "Yellow"},
{"Code": "23","Color": "Yellow"},
{"Code": "24","Color": "Yellow"},
{"Code": "54","Color": "Yellow"}]

How I can get the Expected output as

[{"Code": "16", "Color": "Red" },    
{"Code": "22","Color": "Yellow"},
{"Code": "23","Color": "Yellow"},
{"Code": "24","Color": "Yellow"},
{"Code": "54","Color": "Yellow"},
{"Code": "1600","Color": "Blue"},
{"Code": "16a","Color": "Green"}]

Upvotes: 1

Views: 48

Answers (3)

Anindyo Bose
Anindyo Bose

Reputation: 183

Thanks Nina a slight modification done to the solution as typescript was restricting typecasting

let test = [{ Code: '16', Color: "Red" }, { Code: '54', Color: "Yellow" }, { Code: '24', Color: "Yellow" }, { Code: '1600', Color: "Blue" }, { Code: '16a', Color: "Green" }, { Code: '22', Color: "Yellow" }, { Code: '23', Color: "Yellow" }];

test.sort(({ Code: a }, { Code: b }) =>
    +isFinite(+b) - +isFinite(+a) ||
    +a - +b ||
    a.localeCompare(b)
); 

console.log(test);

Upvotes: 0

Aleksandar Zoric
Aleksandar Zoric

Reputation: 1483

Try something as follows;

test.sort(a,b) => a.Code.localeCompare(b.Code, 'en', { numeric: true });

There is other possible solution if the above does not work as you expect.

Ref: Sort mixed alpha/numeric array

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386550

You could check for numbers and move number to top and sort by numbers or by string.

let test = [{ Code: '16', Color: "Red" }, { Code: '54', Color: "Yellow" }, { Code: '24', Color: "Yellow" }, { Code: '1600', Color: "Blue" }, { Code: '16a', Color: "Green" }, { Code: '22', Color: "Yellow" }, { Code: '23', Color: "Yellow" }];

test.sort(({ Code: a }, { Code: b }) =>
    isFinite(b) - isFinite(a) ||
    a - b ||
    a.localeCompare(b)
);
console.log(test);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 1

Related Questions