Skip to content

Array of numbers wrong sortΒ #58160

Closed as not planned
Closed as not planned

Description

πŸ”Ž 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

Activity

  1. MartinJohns commented on Apr 12, 2024

    @MartinJohns
    Contributor

    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.

  2. zefir1990 commented on Apr 12, 2024

    @zefir1990
    Author

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

  3. MartinJohns commented on Apr 12, 2024

    @MartinJohns
    Contributor

    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.

  4. zefir1990 commented on Apr 12, 2024

    @zefir1990
    Author

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

  5. MartinJohns commented on Apr 12, 2024

    @MartinJohns
    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

  6. zefir1990 commented on Apr 12, 2024

    @zefir1990
    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.
  7. MartinJohns commented on Apr 12, 2024

    @MartinJohns
    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

  8. zefir1990 commented on Apr 12, 2024

    @zefir1990
    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.

  9. MartinJohns commented on Apr 12, 2024

    @MartinJohns
    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.

  10. locked as resolved and limited conversation to collaborators on Oct 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Working as IntendedThe behavior described is the intended behavior; this is not a bug

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions