Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.12.2016, 06:47
Новичок на форуме
Отправить личное сообщение для SergeyShatter Посмотреть профиль Найти все сообщения от SergeyShatter
 
Регистрация: 12.12.2016
Сообщений: 2

Описание интерфейса метода с использованием тест-файла Mocha
К сожалению я недостаточно хорошо понимаю ООП в JS и как следствие я застрял на написании очередного метода. Речь идет об алгоритме Max Heap. Ниже приведена лишь часть, которой достаточно для реализации метода. Суть задания: Дан набор методов. Необходимо реализовать их интерфейс используя код теста Mocha. В данный момент я застрял на методе swapWithParent(). Подскажите пожалуйста как его реализовать.
Заранее благодарю всех, кто примет участие!

Основной файл:

"use strict";

class Node {
constructor(data, priority) {
this.data = data;
this.priority = priority;
this.parent = null;
this.left = null;
this.right = null;
}

appendChild(node) {
node.parent = this;

if (this.left && this.right) {
return;
}

if (this.left) {
this.right = node;
return;
}

this.left = node;
}

removeChild(node) {
if (node == this.left) {
this.left = null;
} else if(node == this.right) {
this.right = null;
} else return error;

node.parent = null;
}

remove() {
if (!this.parent) {
return;
} else {
this.parent.removeChild(this);
}
}

swapWithParent() {
if (!this.parent) {
return;
}

}
}

module.exports = Node;


Описание работы метода swapWithParent() в тест файле Mocha:

describe('#swapWithParent', () => {
it('does nothing if node does not have parent', () => {
const node = new Node(15, 42);

expect(() => {
node.swapWithParent();
}).not.to.throw();
});

it('updates parent.parent', () => {
const parent = new Node(15, 42);
const child = new Node(42, 15);

parent.appendChild(child);
child.swapWithParent();

expect(parent.parent).to.equal(child);
});

it('updates parent.parent.parent', () => {
const root = new Node(8, 8);
const child = new Node(4, 4);
const grandson = new Node(2, 2);

root.appendChild(child);
child.appendChild(grandson);

grandson.swapWithParent();

expect(child.parent).to.equal(grandson);
expect(grandson.parent).to.equal(root);
});

it('updates child.parent', () => {
const parentOfParent = new Node(100, 500);
const parent = new Node(15, 42);
const child = new Node(42, 15);

parentOfParent.appendChild(parent);
parent.appendChild(child);
child.swapWithParent();

expect(child.parent).to.equal(parentOfParent);
});

it('updates parent.child.parent', () => {
const root = new Node(1, 2);
const left = new Node(3, 4);
const right = new Node(5, 6);

root.appendChild(left);
root.appendChild(right);

right.swapWithParent();

expect(left.parent).to.equal(right);
})

it('updates children of node and parent node', () => {
const root = new Node(42, 15);
const left = new Node(13, 42);
const right = new Node(0, 1);
const childOfLeft = new Node(0, 15);

root.appendChild(left);
root.appendChild(right);
left.appendChild(childOfLeft);

left.swapWithParent();

expect(left.right).to.equal(right);
expect(left.left).to.equal(root);
expect(root.left).to.equal(childOfLeft);
});

it('maintains correct state of parent.parent.left and parent.parent.right', () => {
const root = new Node(15, 42);
const left = new Node(42, 15);
const right = new Node(13, 42);
const childOfLeft = new Node(13, 34);
const childOfRight = new Node(0, 1);

root.appendChild(left);
root.appendChild(right);
left.appendChild(childOfLeft);
right.appendChild(childOfRight);

childOfLeft.swapWithParent();
childOfRight.swapWithParent();

expect(root.left).to.equal(childOfLeft);
expect(root.right).to.equal(childOfRight);
});
});
Ответить с цитированием
  #2 (permalink)  
Старый 24.01.2017, 02:35
Новичок на форуме
Отправить личное сообщение для sashaKazakevich Посмотреть профиль Найти все сообщения от sashaKazakevich
 
Регистрация: 24.01.2017
Сообщений: 2

Привет! я новичек и решаю тоже это задание вот моя реализация этого метода все тесты проходят возможно реализация далека от идеала но зато есть почва для размышлений

swapWithParent() {
		if (!this.parent) return

		var thisChildLeft = this.left;
		var thisChildRight = this.right;
		var thisParent = this.parent;

		var parentChildRight = this.parent.right;
		var parentChildLeft = this.parent.left;
		var parentParent = this.parent.parent;

		if(parentParent){
			var parentParentLeft = this.parent.parent.left;
			var parentParentRight = this.parent.parent.right;
		}

		this.parent.parent = this;
		this.parent = parentParent;

		if (this === parentChildRight){
			if (parentChildLeft){
				this.left = parentChildLeft;
				parentChildLeft.parent = this;
			}

			this.right = thisParent;
			thisParent.rigth = thisChildRight;
			thisParent.left = thisChildLeft;
		}

		if (this === parentChildLeft){
			if (parentChildRight){
				this.right = parentChildRight;
				parentChildRight.parent = this;
			}

			this.left = thisParent;
			thisParent.rigth = thisChildRight;
			thisParent.left = thisChildLeft;
		}


		if (thisParent === parentParentLeft){
			this.parent.left = this;
		}

		if (thisParent === parentParentRight){
			this.parent.right = this;
		}
	}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описание интерфейса метода с использованием тест-файла Mocha SergeyShatter Элементы интерфейса 1 24.01.2017 02:56
Выпадающее меню на JS (подкатегории) Trueplayer Events/DOM/Window 5 18.09.2014 22:29
Древовидное меню и селекторы youstm jQuery 6 15.09.2014 12:42
Загрузка файла с использованием drag and drop art_maestro Общие вопросы Javascript 2 01.08.2011 02:46