From 6888fb56a26af69dd03df9058f6cc2ff882dabe0 Mon Sep 17 00:00:00 2001 From: FairTex Date: Wed, 23 Nov 2016 23:18:15 +0500 Subject: [PATCH 1/6] commit --- lib.js | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 7 deletions(-) diff --git a/lib.js b/lib.js index 60f30ab..8b4689a 100644 --- a/lib.js +++ b/lib.js @@ -5,9 +5,71 @@ * @constructor * @param {Object[]} friends * @param {Filter} filter + * @param {Number} maxLevel */ -function Iterator(friends, filter) { - console.info(friends, filter); +function Iterator(friends, filter, maxLevel) { + if (!(filter instanceof Filter)) { + throw new TypeError(); + } + + var depth = maxLevel || -1; + var book = createBook(friends); + var index = 0; + var bestFriends = friends.filter(function (friend) { + return friend.best; + }).map(function (friend) { + return friend.name; + }); + var invitedFriends = inviteFriends(bestFriends, book, filter, depth); + + this.next = function () { + return this.done() ? null : invitedFriends[index++]; + }; + + this.done = function () { + return index >= invitedFriends.length; + }; +} + +function createBook(friends) { + return friends.reduce(function (book, friend) { + book[friend.name] = { + friends: friend.friends, + gender: friend.gender + }; + + return book; + }, {}); +} + +function getAllFriends(people, book) { + + return people.reduce(function (allFriends, friend) { + return allFriends.concat(book[friend].friends); + }, []); +} + +function inviteFriends(bestFriends, book, filter, depth) { + var invited = filter.filter(bestFriends, book); + invited.sort(); + + var allFriends = bestFriends; + depth--; + + while (depth !== 0) { + allFriends = getAllFriends(allFriends, book); + var nextInvitedFriends = filter.filter(allFriends, book); + nextInvitedFriends = nextInvitedFriends.filter(function (friend) { + return invited.indexOf(friend) === -1; + }); + if (nextInvitedFriends.length === 0) { + break; + } + invited = invited.concat(nextInvitedFriends); + depth--; + } + + return invited; } /** @@ -19,15 +81,24 @@ function Iterator(friends, filter) { * @param {Number} maxLevel – максимальный круг друзей */ function LimitedIterator(friends, filter, maxLevel) { - console.info(friends, filter, maxLevel); + Iterator.call(this, friends, filter, maxLevel); } /** * Фильтр друзей * @constructor + * @param {String} gender */ -function Filter() { - console.info('Filter'); +function Filter(gender) { + this.gender = gender; + this.filter = function (invited, book) { + var inv = invited.filter(function (friend) { + return book[friend].gender === gender; + }); + inv.sort(); + + return inv; + }; } /** @@ -36,7 +107,7 @@ function Filter() { * @constructor */ function MaleFilter() { - console.info('MaleFilter'); + Filter.call(this, 'male'); } /** @@ -45,9 +116,13 @@ function MaleFilter() { * @constructor */ function FemaleFilter() { - console.info('FemaleFilter'); + Filter.call(this, 'female'); } +FemaleFilter.prototype = Filter.prototype; +MaleFilter.prototype = Filter.prototype; +LimitedIterator.prototype = Iterator.prototype; + exports.Iterator = Iterator; exports.LimitedIterator = LimitedIterator; From bfa8c3b3fab39bc7346a615e81bdf6aaf9d64cc0 Mon Sep 17 00:00:00 2001 From: FairTex Date: Wed, 23 Nov 2016 23:24:39 +0500 Subject: [PATCH 2/6] lint --- lib.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib.js b/lib.js index 8b4689a..e638ff5 100644 --- a/lib.js +++ b/lib.js @@ -49,6 +49,13 @@ function getAllFriends(people, book) { }, []); } +function filterCollection(nextInvitedFriends, invited) { + + return nextInvitedFriends.filter(function (friend) { + return invited.indexOf(friend) === -1; + }); +} + function inviteFriends(bestFriends, book, filter, depth) { var invited = filter.filter(bestFriends, book); invited.sort(); @@ -59,9 +66,7 @@ function inviteFriends(bestFriends, book, filter, depth) { while (depth !== 0) { allFriends = getAllFriends(allFriends, book); var nextInvitedFriends = filter.filter(allFriends, book); - nextInvitedFriends = nextInvitedFriends.filter(function (friend) { - return invited.indexOf(friend) === -1; - }); + nextInvitedFriends = filterCollection(nextInvitedFriends, invited); if (nextInvitedFriends.length === 0) { break; } From 748b0416fa650afd6361e0b13e68bca0f998a617 Mon Sep 17 00:00:00 2001 From: FairTex Date: Wed, 23 Nov 2016 23:33:51 +0500 Subject: [PATCH 3/6] fix --- lib.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib.js b/lib.js index e638ff5..62685b0 100644 --- a/lib.js +++ b/lib.js @@ -23,7 +23,16 @@ function Iterator(friends, filter, maxLevel) { var invitedFriends = inviteFriends(bestFriends, book, filter, depth); this.next = function () { - return this.done() ? null : invitedFriends[index++]; + if (this.done) { + return null; + } + + var name = invitedFriends[index++]; + for (var i = 0; i < friends.length; i++) { + if (friends[i].name === name) { + return friends[i]; + } + } }; this.done = function () { From b5d0a63aff2d11d79eea71eb4cf80632ee62ce98 Mon Sep 17 00:00:00 2001 From: FairTex Date: Wed, 23 Nov 2016 23:40:10 +0500 Subject: [PATCH 4/6] =?UTF-8?q?=D0=A1=D0=BA=D0=BE=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib.js b/lib.js index 62685b0..b1ee000 100644 --- a/lib.js +++ b/lib.js @@ -23,7 +23,7 @@ function Iterator(friends, filter, maxLevel) { var invitedFriends = inviteFriends(bestFriends, book, filter, depth); this.next = function () { - if (this.done) { + if (this.done()) { return null; } From a8220db6b26b19f2955f611d03ccc574c9f14ba1 Mon Sep 17 00:00:00 2001 From: FairTex Date: Wed, 23 Nov 2016 23:44:35 +0500 Subject: [PATCH 5/6] filter --- lib.js | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/lib.js b/lib.js index b1ee000..7c08d75 100644 --- a/lib.js +++ b/lib.js @@ -103,15 +103,11 @@ function LimitedIterator(friends, filter, maxLevel) { * @constructor * @param {String} gender */ -function Filter(gender) { - this.gender = gender; - this.filter = function (invited, book) { - var inv = invited.filter(function (friend) { - return book[friend].gender === gender; - }); - inv.sort(); +function Filter() { + this.filter = function (invited) { + invited.sort(); - return inv; + return invited; }; } @@ -121,7 +117,14 @@ function Filter(gender) { * @constructor */ function MaleFilter() { - Filter.call(this, 'male'); + this.filter = function (invited, book) { + var inv = invited.filter(function (friend) { + return book[friend].gender === 'male'; + }); + inv.sort(); + + return inv; + }; } /** @@ -130,7 +133,14 @@ function MaleFilter() { * @constructor */ function FemaleFilter() { - Filter.call(this, 'female'); + this.filter = function (invited, book) { + var inv = invited.filter(function (friend) { + return book[friend].gender === 'female'; + }); + inv.sort(); + + return inv; + }; } FemaleFilter.prototype = Filter.prototype; From 6884130a6334a472e47f03e2b96ad566270db4a8 Mon Sep 17 00:00:00 2001 From: FairTex Date: Thu, 24 Nov 2016 00:02:10 +0500 Subject: [PATCH 6/6] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib.js | 60 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/lib.js b/lib.js index 7c08d75..42f76be 100644 --- a/lib.js +++ b/lib.js @@ -1,20 +1,13 @@ 'use strict'; -/** - * Итератор по друзьям - * @constructor - * @param {Object[]} friends - * @param {Filter} filter - * @param {Number} maxLevel - */ -function Iterator(friends, filter, maxLevel) { +function getInvitedFriends(friends, filter, maxLevel) { if (!(filter instanceof Filter)) { throw new TypeError(); } var depth = maxLevel || -1; var book = createBook(friends); - var index = 0; + var bestFriends = friends.filter(function (friend) { return friend.best; }).map(function (friend) { @@ -22,23 +15,37 @@ function Iterator(friends, filter, maxLevel) { }); var invitedFriends = inviteFriends(bestFriends, book, filter, depth); - this.next = function () { - if (this.done()) { - return null; - } + return invitedFriends; +} + +/** + * Итератор по друзьям + * @constructor + * @param {Object[]} friends + * @param {Filter} filter + * @param {Number} maxLevel + */ +function Iterator(friends, filter, maxLevel) { + this.invitedFriends = getInvitedFriends(friends, filter, maxLevel); + this.index = 0; + this.friends = friends; +} +Iterator.prototype.next = function () { + if (this.done()) { + return null; + } - var name = invitedFriends[index++]; - for (var i = 0; i < friends.length; i++) { - if (friends[i].name === name) { - return friends[i]; - } + var name = this.invitedFriends[this.index++]; + for (var i = 0; i < this.friends.length; i++) { + if (this.friends[i].name === name) { + return this.friends[i]; } - }; + } +}; - this.done = function () { - return index >= invitedFriends.length; - }; -} +Iterator.prototype.done = function () { + return this.index >= this.invitedFriends.length; +}; function createBook(friends) { return friends.reduce(function (book, friend) { @@ -101,7 +108,6 @@ function LimitedIterator(friends, filter, maxLevel) { /** * Фильтр друзей * @constructor - * @param {String} gender */ function Filter() { this.filter = function (invited) { @@ -143,9 +149,9 @@ function FemaleFilter() { }; } -FemaleFilter.prototype = Filter.prototype; -MaleFilter.prototype = Filter.prototype; -LimitedIterator.prototype = Iterator.prototype; +FemaleFilter.prototype = Object.create(Filter.prototype); +MaleFilter.prototype = Object.create(Filter.prototype); +LimitedIterator.prototype = Object.create(Iterator.prototype); exports.Iterator = Iterator; exports.LimitedIterator = LimitedIterator;