Skip to content

Commit 5c3c1ae

Browse files
committed
Added compare function for orderBy and thenBy
1 parent 6d0f190 commit 5c3c1ae

File tree

4 files changed

+46
-17
lines changed

4 files changed

+46
-17
lines changed

linq.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ declare namespace Enumerable {
112112
sequenceEqual(second: T[]): boolean;
113113
sequenceEqual<TCompare>(second: T[], compareSelector: (element: T) => TCompare): boolean;
114114
orderBy<TKey>(keySelector: (element: T) => TKey): IOrderedEnumerable<T>;
115+
orderBy<TKey>(keySelector: (element: T) => TKey, comparer: (first: T, second: T) => number): IOrderedEnumerable<T>;
115116
orderByDescending<TKey>(keySelector: (element: T) => TKey): IOrderedEnumerable<T>;
117+
orderByDescending<TKey>(keySelector: (element: T) => TKey, comparer: (first: T, second: T) => number): IOrderedEnumerable<T>;
116118
reverse(): IEnumerable<T>;
117119
shuffle(): IEnumerable<T>;
118120
weightedSample(weightSelector: (element: T) => number): IEnumerable<T>;
@@ -203,9 +205,11 @@ declare namespace Enumerable {
203205
}
204206

205207
export interface IOrderedEnumerable<T> extends IEnumerable<T> {
206-
createOrderedEnumerable<TKey>(keySelector: (element: T) => TKey, descending: boolean): IOrderedEnumerable<T>;
208+
createOrderedEnumerable<TKey>(keySelector: (element: T) => TKey, comparer: (first: T, second: T) => number, descending: boolean): IOrderedEnumerable<T>;
207209
thenBy<TKey>(keySelector: (element: T) => TKey): IOrderedEnumerable<T>;
210+
thenBy<TKey>(keySelector: (element: T) => TKey, comparer: (first: T, second: T) => number): IOrderedEnumerable<T>;
208211
thenByDescending<TKey>(keySelector: (element: T) => TKey): IOrderedEnumerable<T>;
212+
thenByDescending<TKey>(keySelector: (element: T) => TKey, comparer: (first: T, second: T) => number): IOrderedEnumerable<T>;
209213
}
210214

211215
export interface IDisposableEnumerable<T> extends IEnumerable<T> {

linq.js

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,12 +1541,12 @@
15411541

15421542
/* Ordering Methods */
15431543

1544-
Enumerable.prototype.orderBy = function (keySelector) {
1545-
return new OrderedEnumerable(this, keySelector, false);
1544+
Enumerable.prototype.orderBy = function (keySelector, comparer) {
1545+
return new OrderedEnumerable(this, keySelector, comparer, false);
15461546
};
15471547

1548-
Enumerable.prototype.orderByDescending = function (keySelector) {
1549-
return new OrderedEnumerable(this, keySelector, true);
1548+
Enumerable.prototype.orderByDescending = function (keySelector, comparer) {
1549+
return new OrderedEnumerable(this, keySelector, comparer, true);
15501550
};
15511551

15521552
Enumerable.prototype.reverse = function () {
@@ -2501,24 +2501,27 @@
25012501

25022502
// private
25032503

2504-
var OrderedEnumerable = function (source, keySelector, descending, parent) {
2504+
var OrderedEnumerable = function (source, keySelector, comparer, descending, parent) {
25052505
this.source = source;
25062506
this.keySelector = Utils.createLambda(keySelector);
25072507
this.descending = descending;
25082508
this.parent = parent;
2509+
2510+
if (comparer)
2511+
this.comparer = Utils.createLambda(comparer);
25092512
};
25102513
OrderedEnumerable.prototype = new Enumerable();
25112514

2512-
OrderedEnumerable.prototype.createOrderedEnumerable = function (keySelector, descending) {
2513-
return new OrderedEnumerable(this.source, keySelector, descending, this);
2515+
OrderedEnumerable.prototype.createOrderedEnumerable = function (keySelector, comparer, descending) {
2516+
return new OrderedEnumerable(this.source, keySelector, comparer, descending, this);
25142517
};
25152518

2516-
OrderedEnumerable.prototype.thenBy = function (keySelector) {
2517-
return this.createOrderedEnumerable(keySelector, false);
2519+
OrderedEnumerable.prototype.thenBy = function (keySelector, comparer) {
2520+
return this.createOrderedEnumerable(keySelector, comparer, false);
25182521
};
25192522

2520-
OrderedEnumerable.prototype.thenByDescending = function (keySelector) {
2521-
return this.createOrderedEnumerable(keySelector, true);
2523+
OrderedEnumerable.prototype.thenByDescending = function (keySelector, comparer) {
2524+
return this.createOrderedEnumerable(keySelector, comparer, true);
25222525
};
25232526

25242527
OrderedEnumerable.prototype.getEnumerator = function () {
@@ -2549,15 +2552,19 @@
25492552
);
25502553
};
25512554

2552-
var SortContext = function (keySelector, descending, child) {
2555+
var SortContext = function (keySelector, comparer, descending, child) {
25532556
this.keySelector = keySelector;
25542557
this.descending = descending;
25552558
this.child = child;
2559+
this.comparer = comparer;
25562560
this.keys = null;
25572561
};
25582562

25592563
SortContext.create = function (orderedEnumerable, currentContext) {
2560-
var context = new SortContext(orderedEnumerable.keySelector, orderedEnumerable.descending, currentContext);
2564+
var context = new SortContext(
2565+
orderedEnumerable.keySelector, orderedEnumerable.comparer, orderedEnumerable.descending, currentContext
2566+
);
2567+
25612568
if (orderedEnumerable.parent != null) return SortContext.create(orderedEnumerable.parent, context);
25622569
return context;
25632570
};
@@ -2573,7 +2580,9 @@
25732580
};
25742581

25752582
SortContext.prototype.compare = function (index1, index2) {
2576-
var comparison = Utils.compare(this.keys[index1], this.keys[index2]);
2583+
var comparison = this.comparer ?
2584+
this.comparer(this.keys[index1], this.keys[index2]) :
2585+
Utils.compare(this.keys[index1], this.keys[index2]);
25772586

25782587
if (comparison == 0) {
25792588
if (this.child != null) return this.child.compare(index1, index2);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "linq",
33
"author": "Mihai Ciuraru <mihaixc@gmail.com>",
44
"description": "linq.js - LINQ for JavaScript library packaged for node.js",
5-
"version": "3.2.1",
5+
"version": "3.2.2",
66
"homepage": "https://github.com/mihaifm/linq",
77
"repository": {
88
"type": "git",

test/ordering.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ require("../extensions/linq.qunit.js")({'Enumerable': Enumerable});
44

55
module("Ordering");
66

7-
var expected, actual; // will be removed
7+
var expected, actual;
88

99
var list = [
1010
{ a: 2, b: 4, c: 1 },
@@ -30,6 +30,11 @@ test("orderBy", function () {
3030
deepEqual(actual, [1, 7, 31, 51, 51, 85, 99, 823]);
3131

3232
Enumerable.rangeTo(10, 1).orderBy("$%5").is(10, 5, 6, 1, 7, 2, 8, 3, 9, 4);
33+
34+
actual = ['b', 'a', 'd', 'c'];
35+
deepEqual(Enumerable.from(actual).orderBy().toArray(), ['a', 'b', 'c', 'd']);
36+
deepEqual(Enumerable.from(actual).orderBy(x=>x, "(x,y)=>x.localeCompare(y)").toArray(), ['a', 'b', 'c', 'd']);
37+
deepEqual(Enumerable.from(actual).orderBy(x=>x, (x,y)=>x<y).toArray(), ['d', 'c', 'b', 'a']);
3338
});
3439

3540
test("orderByDescending", function () {
@@ -39,6 +44,10 @@ test("orderByDescending", function () {
3944
deepEqual(actual, [823, 99, 85, 51, 51, 31, 7, 1]);
4045

4146
Enumerable.rangeTo(1, 10).orderByDescending("$%5").is(4, 9, 3, 8, 2, 7, 1, 6, 5, 10);
47+
48+
actual = ['b', 'a', 'd', 'c'];
49+
deepEqual(Enumerable.from(actual)
50+
.orderByDescending(x=>x, (x, y)=>x < y ? -1 : +(x > y)).toArray(), ['d', 'c', 'b', 'a']);
4251
});
4352

4453
test("thenBy", function () {
@@ -70,6 +79,13 @@ test("thenBy", function () {
7079
{ a: "z", b: "e", c: "e" }
7180
];
7281
deepEqual(actual, expected);
82+
83+
actual = Enumerable.from(strlist)
84+
.orderBy(l=>l.a)
85+
.thenBy(l=>l, (x,y) => x.b < y.b ? -1 : x.b > y.b ? 1 : x.c < y.c ? -1 : +(x.c > y.c))
86+
.toArray();
87+
88+
deepEqual(actual, expected);
7389
});
7490

7591
test("thenByDescending", function () {

0 commit comments

Comments
 (0)