Kesk -*-
2 min readFeb 17, 2020

--

Hi Greg!,

Now it’s explained in a better way. Thanks for you comment!

Array.Sort Stability

Previously, V8 used an unstable QuickSort for arrays with more than 10 elements. V8(Chrome ≥70) uses the stable TimSort algorithm.

const array1 = [
{ name: "a", age: 14 },
{ name: "b", age: 14 },
{ name: "c", age: 13 },
{ name: "d", age: 13 },
{ name: "e", age: 13 },
{ name: "f", age: 13 },
{ name: "g", age: 13 },
{ name: "h", age: 13 },
{ name: "i", age: 12 },
{ name: "j", age: 12 },
{ name: "k", age: 12 }
]
const array2 = array1.sort( (a,b) => b.age - a.age)

The array is pre-sorted alphabetically by name. To sort by age instead we pass a custom callback that compares the ages. This is the result that you’d expect:

0: {name: "a", age: 14}
1: {name: "b", age: 14}

2: {name: "c", age: 13}
3: {name: "d", age: 13}
4: {name: "e", age: 13}
5: {name: "f", age: 13}
6: {name: "g", age: 13}
7: {name: "h", age: 13}
8: {name: "i", age: 12}
9: {name: "j", age: 12}
10: {name: "k", age: 12}

The array is sorted by age, but within each age, they’re still sorted alphabetically by name.

Before, the JavaScript specification didn’t require sort stability for Array.sort, and instead left it up to the implementation. And because this you could also get this sort result where “b” appears before “a”:

0: {name: "b", age: 14}
1: {name: "a", age: 14}

2: {name: "c", age: 13}
3: {name: "d", age: 13}
4: {name: "e", age: 13}
5: {name: "f", age: 13}
6: {name: "g", age: 13}
7: {name: "h", age: 13}
8: {name: "i", age: 12}
9: {name: "j", age: 12}
10: {name: "k", age: 12}

--

--

Kesk -*-
Kesk -*-

Written by Kesk -*-

Software engineer - software Enthusiast - Sci-Fi writer.

No responses yet