|
JavaScript / HTML Создание динамической разметки страниц |
16.10.2013, 21:34
|
#1
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
node js связанный список
Написал связанный список для своих нужд (знаю есть готовые, но этж велосипед и опыт).
function LinkedList() { this.first = null; this.last = null; this.length = 0; }
module.exports = LinkedList;
LinkedList.prototype.addToStart = function (value) { var first = this.first; var newItem = { before: null, after: first, value: value };
if (first) { first.before = newItem; }
if (this.last == null) { this.last = newItem; }
this.first = newItem; this.length++;
return newItem; }; LinkedList.prototype.add = LinkedList.prototype.addToEnd = function (value) { var last = this.last; var newItem = { before: last, after: null, value: value };
if (last) { last.after = newItem; }
if (this.first == null) { this.first = newItem; }
this.last = newItem; this.length++;
return newItem; };
LinkedList.prototype.insertBefore = function (value, listItem) { if (!listItem) { throw new Error('listItem == null'); }
var newItem = { before: listItem.before, after: listItem, value: value };
if (newItem.before == null) { this.first = newItem; } else { newItem.before.after = newItem; }
listItem.before = newItem;
this.length++; return newItem; };
LinkedList.prototype.insertAfter = function (value, listItem) { if (!listItem) { throw new Error('listItem == null'); }
var newItem = { before: listItem, after: listItem.after, value: value };
if (newItem.after == null) { this.last = newItem; } else { newItem.after.before = newItem; }
listItem.after = newItem;
this.length++;
return newItem; };
LinkedList.prototype.remove = function (listItem) {
if (listItem.before) { listItem.before.after = listItem.after; } else { this.first = listItem.after; }
if (listItem.after) { listItem.after.before = listItem.before; } else { this.last = listItem.before; } this.length--; };
LinkedList.prototype.foreach = function (processItemCallback, onEndCallback) { var item = this.first;
function nextItemProcessor(item) { return function () { if (item) { processItemCallback(item, nextItemProcessor(item.after)); } else { if (onEndCallback) onEndCallback(); } }; }
if (item) { processItemCallback(item, nextItemProcessor(item.after)); } else { if (onEndCallback) onEndCallback(); } };
тесты:
var util = require('util'); var LinkedList = require('./LinkedList');
var list = new LinkedList();
list.add('one'); // добавление в конец list.add('two'); // добавление в конец var three = list.add("three"); // добавление в конец
var items = []; console.log(list.length); list.foreach(function (item, next) { items.push(item.value); next(); }, function () { console.log(util.inspect(items)); });
var five = list.insertAfter('five', three); // вставка после
list.insertBefore('four', five); // вставка до
list.insertAfter('six', five); // вставка после
items = []; console.log(list.length); list.foreach(function (item, next) { items.push(item.value); next(); }, function () { console.log(util.inspect(items)); });
items = [];
var two = three.before; list.remove(three); // удаление list.insertAfter(3, two); // вставка после list.remove(list.last); // удаление
console.log(list.length);
list.foreach(function (item, next) { items.push(item.value); next(); }, function () { console.log(util.inspect(items)); });
list.addToEnd(6); // добавление в конец списка items = [];
console.log(list.length);
list.foreach(function (item, next) { items.push(item.value); next(); }, function () { console.log(util.inspect(items)); });
list.remove(list.first); // удаление первого элемента list.remove(list.first); // удаление первого элемента list.addToStart(1); // добавление в начало list.insertAfter('два', list.first); // добавление после первого list.insertBefore('zero', list.first); // добавление перед первым items = [];
console.log(list.length);
list.foreach(function (item, next) { items.push(item.value); next(); }, function () { console.log(util.inspect(items)); });
результаты тестов:
C:\nodejs\node.exe LinkedList.js
3
[ 'one', 'two', 'three' ]
6
[ 'one', 'two', 'three', 'four', 'five', 'six' ]
5
[ 'one', 'two', 3, 'four', 'five' ]
6
[ 'one', 'two', 3, 'four', 'five', 6 ]
7
[ 'zero', 1, 'два', 3, 'four', 'five', 6 ]
Process finished with exit code 0
Последний раз редактировалось pax, 16.10.2013 в 23:32.
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
16.10.2013, 23:21
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: node js связанный список
Клёво.
Чтобы сделать модуль для front-end'а и back-end'а, замени:
module.exports = LinkedList;
На:
if (module !== undefined) { module.exports = LinkedList; }
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
16.10.2013, 23:38
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: node js связанный список
Можно еще добавить функцию очистки
LinkedList.prototype.clear = function () { this.first = null; this.last = null; this.length = 0; };
Upd: финальная версия
function LinkedList() { this.first = null; this.last = null; this.length = 0; } if (module !== undefined) { module.exports = LinkedList; } LinkedList.prototype.addToStart = function (value) { var first = this.first; var newItem = { before: null, after: first, value: value }; if (first) { first.before = newItem; } if (this.last == null) { this.last = newItem; } this.first = newItem; this.length++; return newItem; }; LinkedList.prototype.add = LinkedList.prototype.addToEnd = function (value) { var last = this.last; var newItem = { before: last, after: null, value: value }; if (last) { last.after = newItem; } if (this.first == null) { this.first = newItem; } this.last = newItem; this.length++; return newItem; }; LinkedList.prototype.insertBefore = function (value, listItem) { if (!listItem) { throw new Error('listItem == null'); } var newItem = { before: listItem.before, after: listItem, value: value }; if (newItem.before == null) { this.first = newItem; } else { newItem.before.after = newItem; } listItem.before = newItem; this.length++; return newItem; }; LinkedList.prototype.insertAfter = function (value, listItem) { if (!listItem) { throw new Error('listItem == null'); } var newItem = { before: listItem, after: listItem.after, value: value }; if (newItem.after == null) { this.last = newItem; } else { newItem.after.before = newItem; } listItem.after = newItem; this.length++; return newItem; }; LinkedList.prototype.remove = function (listItem) { if (listItem.before) { listItem.before.after = listItem.after; } else { this.first = listItem.after; } if (listItem.after) { listItem.after.before = listItem.before; } else { this.last = listItem.before; } this.length--; }; LinkedList.prototype.clear = function () { this.first = null; this.last = null; this.length = 0; }; LinkedList.prototype.foreach = function (processItemCallback, onEndCallback) { function nextItemProcessor(item) { return function () { if (item) { processItemCallback(item, nextItemProcessor(item.after)); } else { if (onEndCallback) onEndCallback(); } }; } nextItemProcessor(this.first)(); };
Последний раз редактировалось pax, 17.10.2013 в 10:20.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.10.2013, 10:09
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: node js связанный список
Еще один метод toArray, а так же теперь нельзя удалить элемент из чужого списка (каждый элемент хранит ссылку на список)
function LinkedList() { this.first = null; this.last = null; this.length = 0; } if (module !== undefined) { module.exports = LinkedList; } LinkedList.prototype.addToStart = function (value) { var first = this.first; var newItem = { before: null, after: first, value: value, list: this }; if (first) { first.before = newItem; } if (this.last == null) { this.last = newItem; } this.first = newItem; this.length++; return newItem; }; LinkedList.prototype.add = LinkedList.prototype.addToEnd = function (value) { var last = this.last; var newItem = { before: last, after: null, value: value, list: this }; if (last) { last.after = newItem; } if (this.first == null) { this.first = newItem; } this.last = newItem; this.length++; return newItem; }; LinkedList.prototype.insertBefore = function (value, listItem) { if (!listItem) { throw new Error('listItem == null'); } var newItem = { before: listItem.before, after: listItem, value: value, list: this }; if (newItem.before == null) { this.first = newItem; } else { newItem.before.after = newItem; } listItem.before = newItem; this.length++; return newItem; }; LinkedList.prototype.insertAfter = function (value, listItem) { if (!listItem) { throw new Error('listItem == null'); } var newItem = { before: listItem, after: listItem.after, value: value, list: this }; if (newItem.after == null) { this.last = newItem; } else { newItem.after.before = newItem; } listItem.after = newItem; this.length++; return newItem; }; LinkedList.prototype.remove = function (listItem) { if (!listItem) { throw new Error('listItem == null'); } if (listItem.list !== this) { throw new Error('listItem from another list!'); } if (listItem.before) { listItem.before.after = listItem.after; } else { this.first = listItem.after; } if (listItem.after) { listItem.after.before = listItem.before; } else { this.last = listItem.before; } listItem.list = null; listItem.before = null; listItem.after = null; this.length--; }; LinkedList.prototype.clear = function () { this.foreach(function(element, next){ element.before = null; element.after = null; element.list = null; next(); }); this.first = null; this.last = null; this.length = 0; }; LinkedList.prototype.toArray = function () { var array = new Array(this.length); var element = this.first; var index = 0; while (element) { array[index++] = element.value; element = element.after; } return array; }; LinkedList.prototype.foreach = function (processItemCallback, onEndCallback) { function nextItemProcessor(item) { return function () { if (item) { processItemCallback(item, nextItemProcessor(item.after)); } else { if (onEndCallback) onEndCallback(); } }; } nextItemProcessor(this.first)(); };
|
(Offline)
|
|
17.10.2013, 13:46
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: node js связанный список
forEach
|
(Offline)
|
|
17.10.2013, 18:50
|
#6
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: node js связанный список
весь linq туда
__________________
|
(Offline)
|
|
17.10.2013, 20:09
|
#7
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: node js связанный список
Сообщение от moka
forEach
|
Если расценивать не как ключевое слово..., а меня устраивает в нижнем регистре))
|
(Offline)
|
|
17.10.2013, 20:21
|
#8
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: node js связанный список
Ну это имхо не явное исключение
Тем более если forEach то будет более консистентно со всеми другими подобными либами, и также даст больше разницы между ключевым словом - т.к. разница есть и не стоит её стирать..
имхо.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:57.
|