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 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, время: 10:01.