Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   alert({ня:3} == {ня:3})//false (https://javascript.ru/forum/misc/24306-alert-%7Bnya-3%7D-%3D%3D-%7Bnya-3%7D-false.html)

Gvozd 27.12.2011 13:48

Цитата:

Сообщение от Livaanderiamarum
не равны потому что разная память. не продолжаем потому что обнаружено кольцо.

Почему бы по факту разной памяти не остановится на первом же шаге, при проверке исходных объектов?)
Как это происходит в обычном операторе сравнения?)

Livaanderiamarum 27.12.2011 13:52

Цитата:

Сообщение от Gvozd (Сообщение 146411)
Почему бы по факту разной памяти не остановится на первом же шаге, при проверке исходных объектов?)
Как это происходит в обычном операторе сравнения?)

ой, точно я не понял сначала вопроса. в общем у меня есть вариант как это сделать просто расписывать лень. или все же расписать?

Livaanderiamarum 27.12.2011 13:55

сравнить таблицы с вложенными таблицами, это просто.
Но дело том что они могут быть цикличными. тут происходит анализ на цикличность.. и если наш скрипт смотрит что ссылка ведет на обьект который уже был получен ранее (фиксируется кольцевание кольцевание) , и этот обьект щас в стеке проверки. то тогда сравниваются названия ключей этого обьекта(из стека) и сравниваемого обьекта. если есть разница в названиях ключей, то обьекты не равны. если нет разницы, но кольцевание продолжается, тогда обьекты считаются разными, и продолжается анализ дальше, если там не найдено расхождений. то обьекты считаются раЗными из-за неопределенности. Иными словами таким методом хорошо закрученные обьекты не сравнить. Это ЕСЛИ этот метод на js делать, а если делать на уровне движка, то тут любые обьекты сравнить можно.

Gvozd 27.12.2011 15:02

Цитата:

Сообщение от Livaanderiamarum
Это ЕСЛИ этот метод на js делать, а если делать на уровне движка, то тут любые обьекты сравнить можно.

А какое алгоритмическое преимущество даст уровень движка для этой задачи?
JS - тьюринг полный, так что на нем можно решить тот же класс задач, что и на уровне движка.
Так что "хорошо закрученные объекты" можно с одинаковым успехом сравнивать как на уровне движка, так и на уровне JS
Тот алгоритм, который ты привел - не позволяет их сравнить.

[telepatemode]
Может быть тебе не хватает функции получения адреса объекта в памяти?
Средствами JS вполне можно написать функцию, возвращающую "виртуальный" адрес в памяти, основываясь на стандартном операторе сравнения объектов.
Но, это так - предположение чего тебе не хватает.
[/telepatemode]

В общем все-таки хотелось бы увидеть алгоритм для "хорошо закрученных объектов"

Livaanderiamarum 27.12.2011 15:06

Цитата:

Сообщение от Gvozd (Сообщение 146431)
А какое алгоритмическое преимущество даст уровень движка для этой задачи?
JS - тьюринг полный, так что на нем можно решить тот же класс задач, что и на уровне движка.
Так что "хорошо закрученные объекты" можно с одинаковым успехом сравнивать как на уровне движка, так и на уровне JS
Тот алгоритм, который ты привел - не позволяет их сравнить.

[telepatemode]
Может быть тебе не хватает функции получения адреса объекта в памяти?
Средствами JS вполне можно написать функцию, возвращающую "виртуальный" адрес в памяти, основываясь на стандартном операторе сравнения объектов.
Но, это так - предположение чего тебе не хватает.
[/telepatemode]

В общем все-таки хотелось бы увидеть алгоритм для "хорошо закрученных объектов"

давайте напишем?

trikadin 27.12.2011 15:12

Цитата:

Сообщение от Livaanderiamarum
давайте напишем?

Так пиши)) Тебе же нужно))

Gvozd 27.12.2011 15:25

Цитата:

Сообщение от trikadin
Так пиши)) Тебе же нужно))

+1

Livaanderiamarum 27.12.2011 16:06

Цитата:

Сообщение от Gvozd (Сообщение 146442)
+1

так пиши! тебе же хотелось бы увидеть) че тупишь то) не в обиду! если не понятна нить разговора то перечитывай тред)!

Gvozd 28.12.2011 01:28

Цитата:

Сообщение от Livaanderiamarum
так пиши! тебе же хотелось бы увидеть) че тупишь то) не в обиду! если не понятна нить разговора то перечитывай тред)!

Как я понял из треда, ты считаешь существующий механизм сравнения объектов неудобным/неправильным, и противопоставляешь ему сравнение, которое выдало бы для двух объектов с одинаковой структурой, что они равны.
У вас спросили, как бы вы сравнивали два объекта с рекурсивными ссылками, а я развил эту мысль.
А развил я ее, потому что интересующий вас механизм сравнения объектов не является таким уж очевидным с точки зрения алгоритма.

Практической пользы для меня от данного алгоритма - ноль
Чисто академический интерес, потому что я не вижу однозначного алгоритма, который бы работал для таких сложных объектов.

В вас же я заметил как практический, так и академический интерес к этой задаче. Возможно и ошибся)

Поэтому, я и предложил вам формализовать ваш алгоритм до конца.
Если вам этот алгоритм не нужен, и вам в практических целях достаточно стандартного сравнения объектов, то можете не реализовывать его.
А если все-таки нужен, то я бы с удовольствием посмотрел бы на вашу реализацию - потому что сам я пока не смог придумать алгоритм, решающий данную задачу.

trikadin 28.12.2011 01:42

Gvozd - рассматривать объект как граф и помечать посещённые узлы, как-то так. Но алгоритм будет... Пиздец)

Gvozd 28.12.2011 02:26

trikadin,
Это вроде уже есть, хоть и не в форме кода.
Хоть и не зацикливается, но толку от алгоритма пока мало, ибо на циклических объектах он вполне может показать неопредленный результат

trikadin 28.12.2011 02:31

Gvozd, ну я же говорю - пиздец. Я бы за такое тысяч за 20-30 взялся, вряд ли меньше...

Aetae 28.12.2011 03:36

Цитата:

Сообщение от Gvozd (Сообщение 146037)
Все-таки как ваш алгоритм от работает на примере?
var a = {};//адрес - 0x0008
var b = {};//адрес - 0x00A8
a.a = a;
b.a = b;
alert(a == b)

И что дальше?
равны текущие свойства или нет? Если да, то почему?

Вообще если сравнивать формально как и желает того оп, то да, они равны ибо значения ключей имеют одинаковый смысл на данный момент времени. Где они там в памяти и как ссылаются сейчас не имеет значения.
И если подходить к вопросу таким образом, то сравнение провести можно просто.

Другое дело - нафига оно надо?)

Livaanderiamarum 28.12.2011 07:31

Цитата:

Сообщение от trikadin (Сообщение 146670)
Gvozd - рассматривать объект как граф и помечать посещённые узлы, как-то так. Но алгоритм будет... Пиздец)

именно графами я бы и определял цикличность))

то есть в примере выше, например, обнаружена цикличность, теперь проверяется РАВНЫ ЛИ ОСТАЛЬНЫЕ СВОЙСТВА этой цикличности, если равны то и цикличности равны)), в данном случае свойств кроме цикличных - нет.

Aetae 28.12.2011 14:10

Вообще что-то я не оч понимаю в чем заморочка. Если есть рекурсия, то коли она находится в обоих объектах на одном и том же месте и ведёт на один и тот же уровень - они, по данной логике, равны.
Те навскидку можно так(без учёта нод, ибо лень и сложно):
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())

Livaanderiamarum 28.12.2011 14:26

Цитата:

Сообщение от Aetae
Если есть рекурсия, то коли она находится в обоих объектах на одном и том же месте и ведёт на один и тот же уровень - они, по данной логике, равны.

ДА, ИМЕННО, тут и значение получать не нужно, главное чтобы они вели на РАВНЫЕ объектыи главное проверить это раньше чем будут обнаружены кольца и начнется их анализ. Так оптимальнее.


Часовой пояс GMT +3, время: 14:04.