1

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"}]
1
  • where you copied this a.Code.localeCompare(b.Code)); may they also said how it works Commented Feb 10, 2022 at 10:10

3 Answers 3

1

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; }

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

Comments

0

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

Comments

0

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);

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.