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

[FEATURE][ADD] Add stableSort function #592

Merged
merged 7 commits into from
Feb 18, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 29 additions & 0 deletions snippets/stableSort.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
### stableSort

Performs stable sort. Useful in Chrome and NodeJS.

Use `Array.map()` to pair each element of the input array with its corresponding index. Then use `Array.sort()` and a user provided `compare()` function. If the items are equal, sort them by their initial index in the input array. Lastly use `Array.map()` to convert back to the initial array items.
Returns new array without modifying the initial one.

```js
var stableSort = (arr, compare) =>

This comment was marked as spam.

arr
.map((item, index) => ({ item, index }))
.sort((a, b) =>
((result = compare(a.item, b.item)) => (result !== 0 ? result : a.index - b.index))()
)
.map(({ item }) => item);
```

```js
var str = 'abcdefghijklmnopqrstuvwxyz';
var compare = (a, b) => ~~(str.indexOf(b) / 2.3) - ~~(str.indexOf(a) / 2.3);

// default Array.sort() is unstable in Chrome and NodeJS + modifies the input array
var arr1 = str.split('');

This comment was marked as spam.

This comment was marked as spam.

console.log(arr1.sort(compare).join('') === 'xyzvwtursopqmnklhijfgdeabc'); // false

// stable sort + returns new array
var arr2 = str.split('');
console.log(stableSort(arr2, compare).join('') === 'xyzvwtursopqmnklhijfgdeabc'); // true
```
1 change: 1 addition & 0 deletions tag_database
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ sortedLastIndex:array,math
sortedLastIndexBy:array,math,function
splitLines:string
spreadOver:adapter
stableSort:array,sort
standardDeviation:math,array
stripHTMLTags:string,utility,regexp
sum:math,array
Expand Down
8 changes: 8 additions & 0 deletions test/stableSort/stableSort.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
var stableSort = (arr, compare) =>
arr
.map((item, index) => ({ item, index }))
.sort((a, b) =>
((result = compare(a.item, b.item)) => (result !== 0 ? result : a.index - b.index))()
)
.map(({ item }) => item);
module.exports = stableSort;
25 changes: 25 additions & 0 deletions test/stableSort/stableSort.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const test = require('tape');
const stableSort = require('./stableSort.js');

test('Testing stableSort', (t) => {
//For more information on all the methods supported by tape
//Please go to https://github.com/substack/tape
t.true(typeof stableSort === 'function', 'stableSort is a Function');
//t.deepEqual(stableSort(args..), 'Expected');
//t.equal(stableSort(args..), 'Expected');
//t.false(stableSort(args..), 'Expected');
//t.throws(stableSort(args..), 'Expected');

// test if js engine's Array#sort implementation is stable
// https://gist.github.com/leeoniya/5816476
var str = 'abcdefghijklmnopqrstuvwxyz';
var compare = (a, b) => ~~(str.indexOf(b) / 2.3) - ~~(str.indexOf(a) / 2.3);

var input = str.split('');
var output = stableSort(input, compare);

t.equal(output.join(''), 'xyzvwtursopqmnklhijfgdeabc');
t.notDeepEqual(input, output);

t.end();
});