Цитата:
Как это происходит в обычном операторе сравнения?) |
Цитата:
|
сравнить таблицы с вложенными таблицами, это просто.
Но дело том что они могут быть цикличными. тут происходит анализ на цикличность.. и если наш скрипт смотрит что ссылка ведет на обьект который уже был получен ранее (фиксируется кольцевание кольцевание) , и этот обьект щас в стеке проверки. то тогда сравниваются названия ключей этого обьекта(из стека) и сравниваемого обьекта. если есть разница в названиях ключей, то обьекты не равны. если нет разницы, но кольцевание продолжается, тогда обьекты считаются разными, и продолжается анализ дальше, если там не найдено расхождений. то обьекты считаются раЗными из-за неопределенности. Иными словами таким методом хорошо закрученные обьекты не сравнить. Это ЕСЛИ этот метод на js делать, а если делать на уровне движка, то тут любые обьекты сравнить можно. |
Цитата:
JS - тьюринг полный, так что на нем можно решить тот же класс задач, что и на уровне движка. Так что "хорошо закрученные объекты" можно с одинаковым успехом сравнивать как на уровне движка, так и на уровне JS Тот алгоритм, который ты привел - не позволяет их сравнить. [telepatemode] Может быть тебе не хватает функции получения адреса объекта в памяти? Средствами JS вполне можно написать функцию, возвращающую "виртуальный" адрес в памяти, основываясь на стандартном операторе сравнения объектов. Но, это так - предположение чего тебе не хватает. [/telepatemode] В общем все-таки хотелось бы увидеть алгоритм для "хорошо закрученных объектов" |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
У вас спросили, как бы вы сравнивали два объекта с рекурсивными ссылками, а я развил эту мысль. А развил я ее, потому что интересующий вас механизм сравнения объектов не является таким уж очевидным с точки зрения алгоритма. Практической пользы для меня от данного алгоритма - ноль Чисто академический интерес, потому что я не вижу однозначного алгоритма, который бы работал для таких сложных объектов. В вас же я заметил как практический, так и академический интерес к этой задаче. Возможно и ошибся) Поэтому, я и предложил вам формализовать ваш алгоритм до конца. Если вам этот алгоритм не нужен, и вам в практических целях достаточно стандартного сравнения объектов, то можете не реализовывать его. А если все-таки нужен, то я бы с удовольствием посмотрел бы на вашу реализацию - потому что сам я пока не смог придумать алгоритм, решающий данную задачу. |
Gvozd - рассматривать объект как граф и помечать посещённые узлы, как-то так. Но алгоритм будет... Пиздец)
|
trikadin,
Это вроде уже есть, хоть и не в форме кода. Хоть и не зацикливается, но толку от алгоритма пока мало, ибо на циклических объектах он вполне может показать неопредленный результат |
Gvozd, ну я же говорю - пиздец. Я бы за такое тысяч за 20-30 взялся, вряд ли меньше...
|
Цитата:
И если подходить к вопросу таким образом, то сравнение провести можно просто. Другое дело - нафига оно надо?) |
Цитата:
то есть в примере выше, например, обнаружена цикличность, теперь проверяется РАВНЫ ЛИ ОСТАЛЬНЫЕ СВОЙСТВА этой цикличности, если равны то и цикличности равны)), в данном случае свойств кроме цикличных - нет. |
Вообще что-то я не оч понимаю в чем заморочка. Если есть рекурсия, то коли она находится в обоих объектах на одном и том же месте и ведёт на один и тот же уровень - они, по данной логике, равны.
Те навскидку можно так(без учёта нод, ибо лень и сложно): Object.prototype.toString=function(){ var objects=[]; return function(){ var n=objects.indexOf(this); if(n>-1)return '[recursion up to level '+n+']'; objects.push(this); var str='{', j; for(j in this)str+='\''+j+'\': '+this[j]+','; objects.pop(); return str.slice(0,-1)+'}'; } }(); var a = {ня:3}; var b = {ня:3,'a':a}; a.a = b; alert(a.toString() == b.toString()) alert(a.toString() +'\n\n'+ b.toString()) |
Цитата:
|
Часовой пояс GMT +3, время: 14:04. |