From 9e6d84fd7eddd5c33df1c318be87f691c870a59f Mon Sep 17 00:00:00 2001 From: Kevin Gin Date: Fri, 26 May 2017 17:20:29 -0700 Subject: [PATCH 1/2] optimized map method by specifiying array size up front --- xrange.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/xrange.js b/xrange.js index b462b7f..e7d7fc4 100644 --- a/xrange.js +++ b/xrange.js @@ -8,18 +8,13 @@ * Create array by executing `map` on each value. */ - var results = []; + var results = new Array(this.length); - var cmp = function (i, finish) { - if (start < finish) { - return i < finish; - } else { - return i > finish; - } - }; + var value = start; - for (var i = start; cmp(i, finish); i += by) { - results.push(callback(i)); + for (var i = 0; i < this.length; i++) { + results[i] = callback(value); + value += by; } return results; From bad7c230942e61d66ae1b2af8c9d74e7756b2ba9 Mon Sep 17 00:00:00 2001 From: Kevin Gin Date: Fri, 26 May 2017 17:37:32 -0700 Subject: [PATCH 2/2] added filter and reduce --- test/test.js | 15 +++++++++++++++ xrange.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/test/test.js b/test/test.js index 6c69858..f3c2b3b 100644 --- a/test/test.js +++ b/test/test.js @@ -155,6 +155,21 @@ describe('Test xrange', function () { return each + 1; }), zero2three); }); + + it('filter', function () { + assert.deepEqual(xrange(-5, 5).filter(function (each) { + return each >= 0 && each <= 3; + }), zero2three); + }); + + it('reduce', function () { + assert.equal(xrange(-5, 8).reduce(function (acc, each) { + return acc + each; + }), 13); + assert.equal(xrange(-5, 8).reduce(function (acc, each) { + return acc + each; + }, 1), 14); + }); }); }); diff --git a/xrange.js b/xrange.js index e7d7fc4..f1ec2c2 100644 --- a/xrange.js +++ b/xrange.js @@ -20,6 +20,37 @@ return results; }; + this.filter = function (callback) { + /** + * Create array of items that satisfy predicate function + */ + + var results = []; + + for (var i = start; i < finish; i += by) { + if (callback(i)) { + results.push(i); + } + } + return results; + }; + + this.reduce = function (callback, acc) { + /** + * Reduces an xrange by specified callback + */ + + if (acc === undefined) { + acc = start; + start += by; + } + + for (var i = start; i < finish; i += by) { + acc = callback(acc, i); + } + return acc; + }; + this.each = this.forEach = function (callback) { /** * Call `callback` on each item. @@ -43,6 +74,8 @@ return each; }); }; + + }; var factory = function (start, finish, by) {