Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Array of numbers wrong sort #58160

Closed
demensdeum opened this issue Apr 12, 2024 · 9 comments
Closed

Array of numbers wrong sort #58160

demensdeum opened this issue Apr 12, 2024 · 9 comments
Labels
Working as Intended The behavior described is the intended behavior; this is not a bug

Comments

@demensdeum
Copy link

πŸ”Ž Search Terms

sort numbers array

πŸ•— Version & Regression Information

Write array of numbers const numbers: number[] = [16, 1, 0, 9, 100], then sort(),
Result sort will be:
[16, 1, 0, 9, 100]

Expected:
[0, 1, 9, 16, 100]

⏯ Playground Link

https://www.typescriptlang.org/play?#code/MYewdgzgLgBGCuBbARgUwE4QFxyW9A2gLowC8MBAjAGwA0Ml9ADPQJz2VNNEBQokIADaoAdIJABzABQIUGCCIgh0UKQEo1QA

πŸ’» Code

const numbers: number[] = [16, 1, 0, 9, 100]
console.log(numbers.sort())

πŸ™ Actual behavior

Result sort will be:
[16, 1, 0, 9, 100]

πŸ™‚ Expected behavior

Expected:
[0, 1, 9, 16, 100]

Additional information about the issue

Suppose to convert to correct array type in JS

@MartinJohns
Copy link
Contributor

MartinJohns commented Apr 12, 2024

This is working as intended. First of all, this is just how JavaScript works, it's completely unrelated to TypeScript. Secondly, the documentation makes clear that the values are converted to strings and then sorted, when no comparer is provided:

If omitted, the array elements are converted to strings, then sorted according to each character's Unicode code point value.

Duplicate of #32593.

@demensdeum
Copy link
Author

@MartinJohns wanted to say that new Float64Array([16, 1, 0, 9, 100]).sort() works correctly

@MartinJohns
Copy link
Contributor

MartinJohns commented Apr 12, 2024

Yes, different types can behave differently. As documented, when omitting the comparer for Float64Arrays sort method the values are sorted by their numeric value:

This method has the same algorithm as Array.prototype.sort(), except that it sorts the values numerically instead of as strings by default.
[..]
If omitted, the typed array elements are sorted according to numeric value.

But again, that's just how JavaScript works and completely unrelated to TypeScript. TypeScript won't change how your code is run.

@demensdeum
Copy link
Author

@MartinJohns
Ok, thnx.
I think it's could be good to transpile to Float64Array or BigInt64Array, like C++ do it with auto deduction.

@MartinJohns
Copy link
Contributor

That's explicitly out of scope for TypeScript. The compiled TypeScript code should behave as-is, just with the types removed. See also: TypeScript Design Goals

@demensdeum
Copy link
Author

  1. But isn't JS does not support generics, but TS does?
  2. So I guess this is good field to improve in TS, because sorting numbers in lex order is frustrating.

@MartinJohns
Copy link
Contributor

  1. But isn't JS does not support generics, but TS does?

Generics only exist at compile time, they're just type information. After compilation anything generic related is completely gone. There's no runtime behavior.

So I guess this is good field to improve in TS, because sorting numbers in lex order is frustrating.

Again, this is explicitly out of scope. See the document I linked. Just provide a comparer if you want numerical sorting for arrays.

You might also want this ESlint rule: require-array-sort-compare

@demensdeum
Copy link
Author

Generics only exist at compile time, they're just type information. After compilation anything generic related is completely gone. There's no runtime behavior.

Same for Float64Array or BigInt64Array auto deduction, it's type information.

require-array-sort-compare

Good rule, but I want to be my code DRY as possible, which could be achieved with Float64Array/BigInt64Array types.
With "sort-compare" I would need to write custom comparators everytime with only-numbers array.

@MartinJohns
Copy link
Contributor

Same for Float64Array or BigInt64Array auto deduction, it's type information.

Those are actual runtime types provided by JavaScript. A Float64Array is not an Array. That's also why they have different runtime behaviors. They're also limited in what they can do, e.g. a BigInt64Array can't store floating point numbers.

With "sort-compare" I would need to write custom comparators everytime with only-numbers array.

πŸ€·β€β™‚οΈ You have to deal with the quirks of the runtime you're dealing with.

@RyanCavanaugh RyanCavanaugh added the Working as Intended The behavior described is the intended behavior; this is not a bug label Apr 12, 2024
@RyanCavanaugh RyanCavanaugh closed this as not planned Won't fix, can't repro, duplicate, stale Apr 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Working as Intended The behavior described is the intended behavior; this is not a bug
Projects
None yet
Development

No branches or pull requests

3 participants