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

Шмакова Мария #14

Open
wants to merge 34 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
bbfb41c
Пока просто проверка правильности алгоритма
MariaShmakova Nov 22, 2016
568484e
Повторная проверка алгоритма
MariaShmakova Nov 22, 2016
e95e761
Попытка найти зацикливание
MariaShmakova Nov 22, 2016
207fada
Добавила условия на null и undefined
MariaShmakova Nov 22, 2016
e69bdf4
Вдруг проблема в копировании основной коллекции
MariaShmakova Nov 22, 2016
9ca2ed9
Случай, когда нет лучших друзей
MariaShmakova Nov 22, 2016
23e50e6
Если нет какого-нибудь уровня
MariaShmakova Nov 22, 2016
0292aed
Убрала пробег по несвязным друзьям
MariaShmakova Nov 22, 2016
7dca655
Добавила сортировку в каждый уровень
MariaShmakova Nov 23, 2016
2291edb
Включила лучших друзей в цикл while
MariaShmakova Nov 23, 2016
b4ae116
Добавила условие для осатнвоки лимита
MariaShmakova Nov 23, 2016
08a75a9
Убрала очищение массива использованных друзей
MariaShmakova Nov 23, 2016
16004c0
Добавила прверку на наличие следующего уровня
MariaShmakova Nov 23, 2016
3a81ef2
Поиск ошибки
MariaShmakova Nov 23, 2016
ef9f066
Объединила в общий метод
MariaShmakova Nov 23, 2016
271f290
Добавила условие для лимита undefined
MariaShmakova Nov 23, 2016
d6dc826
Несколько небольших исправлений
MariaShmakova Nov 23, 2016
458d0a0
откат
MariaShmakova Nov 23, 2016
53ac4fd
Исправление цикла while
MariaShmakova Nov 23, 2016
94c50f3
Аргумент тоже сортирую по алфавиту
MariaShmakova Nov 23, 2016
02b16b4
Обработка несвязных друзей
MariaShmakova Nov 23, 2016
ed41213
В поиске ошибок
MariaShmakova Nov 23, 2016
01f27cb
Убрала из списка несвязных друзей
MariaShmakova Nov 23, 2016
e12cd2f
Убрала лишних людей из списка
MariaShmakova Nov 23, 2016
c6e0ca2
Убрала глобальный список и повторяющийся код
MariaShmakova Nov 23, 2016
f172018
Переделала метод getNextCircle
MariaShmakova Nov 23, 2016
682d606
Вернула подсчет индекса, убрала reverse
MariaShmakova Nov 23, 2016
5296b16
Откат + исправила сортировку
MariaShmakova Nov 23, 2016
b0f570c
Убрала лишние условия и комментарии
MariaShmakova Nov 23, 2016
437a2b4
Отчаялась найти ошибки
MariaShmakova Nov 23, 2016
e6a4087
Лишняя сортировка
MariaShmakova Nov 23, 2016
49716fb
фикс
MariaShmakova Nov 23, 2016
2a847e0
Еще одна попытка убрать reverse
MariaShmakova Nov 23, 2016
6bb246c
Вспоминание ошибок, добавила сортировку в лучших друзей
MariaShmakova Dec 9, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 99 additions & 5 deletions lib.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,89 @@
'use strict';

function compareAlphabetically(person1, person2) {
if (person1.name > person2.name) {
return 1;
}
if (person1.name < person2.name) {
return -1;
}

return 0;
}

function getFirstCircle(friends) {
return friends.filter(function (person) {
return person.best === true;
}).sort(compareAlphabetically);
}

function getNextCircle(friends, currFriends, listGuests) {
currFriends.sort(compareAlphabetically).forEach(function (person) {
if (listGuests.indexOf(person) === -1) {
listGuests.push(person);
person.friends.forEach(function (name) {
var guest = friends.filter(function (friend) {
return friend.name === name;
})[0];
currFriends.push(guest);
});
}
});

return [currFriends, listGuests];
}

function getGuests(friends, filter, maxLevel) {
var currFriends = [].concat(getFirstCircle(friends));
var listGuests = [];
var level = maxLevel;
while (level > 0 && currFriends.length !== 0) {
var countFriends = currFriends.length;
var resultNextCircle = getNextCircle (friends, currFriends, listGuests);
currFriends = resultNextCircle[0];
listGuests = resultNextCircle[1];
currFriends.splice(0, countFriends);
level--;
}

return listGuests.filter(function (friend) {
return filter.filterFriends(friend);
});
}

/**
* Итератор по друзьям
* @constructor
* @param {Object[]} friends
* @param {Filter} filter
*/

function Iterator(friends, filter) {
console.info(friends, filter);

if (!(filter instanceof Filter)) {
throw new TypeError('Incorrect data type Filter');
}
this.index = 0;
this.listGuests = getGuests(friends, filter, Infinity);
// this.listGuests.reverse();
}

Iterator.prototype.done = function () {
// return this.listGuests.length <= 0;
return this.index === this.listGuests.length;
};

Iterator.prototype.next = function () {
if (this.done()) {
return null;
}
var guest = this.listGuests[this.index];
this.index++;

return guest;
// return this.listGuests.pop();
};

/**
* Итератор по друзям с ограничением по кругу
* @extends Iterator
Expand All @@ -18,16 +92,28 @@ function Iterator(friends, filter) {
* @param {Filter} filter
* @param {Number} maxLevel – максимальный круг друзей
*/

function LimitedIterator(friends, filter, maxLevel) {
console.info(friends, filter, maxLevel);
maxLevel = (typeof maxLevel === 'undefined') ? 0 : maxLevel;
if (!(filter instanceof Filter)) {
throw new TypeError('Incorrect data type Filter');
}
this.index = 0;
this.listGuests = getGuests(friends, filter, maxLevel);
// this.listGuests.reverse();
}

LimitedIterator.prototype = Object.create(Iterator.prototype);
LimitedIterator.prototype.constructor = LimitedIterator;

/**
* Фильтр друзей
* @constructor
*/
function Filter() {
console.info('Filter');
this.filter = function () {
return true;
};
}

/**
Expand All @@ -36,17 +122,25 @@ function Filter() {
* @constructor
*/
function MaleFilter() {
console.info('MaleFilter');
this.filterFriends = function (friend) {
return friend.gender === 'male';
};
}
MaleFilter.prototype = Object.create(Filter.prototype);
MaleFilter.prototype.constructor = MaleFilter;

/**
* Фильтр друзей-девушек
* @extends Filter
* @constructor
*/
function FemaleFilter() {
console.info('FemaleFilter');
this.filterFriends = function (friend) {
return friend.gender === 'female';
};
}
FemaleFilter.prototype = Object.create(Filter.prototype);
FemaleFilter.prototype.constructor = FemaleFilter;

exports.Iterator = Iterator;
exports.LimitedIterator = LimitedIterator;
Expand Down