2015-10-26 4 views
3

Я пишу код для рисования гексагональной сетки с использованием svg на экране, поэтому я использую один шестиугольник вместо шаблона, так что я в конечном итоге хочу сделать каждый отдельный шестиугольник объектом ссылка наСтранное поведение при проверке состояния в javascript

У меня есть вид нарисованных шестиугольников, используя некоторые математические и точечные ссылки.

Так вместо того, чтобы этот сложный, то это на самом деле, пытаясь объяснить свой код, вот мой код https://jsfiddle.net/Snedden27/9nnrt7hp/8/,

Моя проблема функция drawHexAround (цент) // строка 41, функция предположим, нарисовать шестиугольник вокруг шестиугольника с Centroid «@cent»

Вот условие проверки:

if (!contains(drawnCentroids,centroidNew)) { 
    makeHex(centroidNew); 
    drawnCentroids.push(centroidNew); 
} 

и вот функ Тион

function contains(a, obj) { 
    var l = a.length; 

    for (var i=0;i<l;i++) { 
     // console.log(a[i],obj); 
     // console.log(a[i] === obj); 

     if (a[i] === obj) { 
      // console.log('true'); 
      return true; 
     } 
    } 

    return false; 
} 

Он рисует шестиугольники в порядке, но он рисует поверх существующих шестиугольников, а также несмотря на меня проверка состояния с contains(a,obj)

Я не понимаю, почему это условие результат всегда верно, когда ясно, что в некоторых случаях должно приводить к ложному.

+0

Ваша скрипка ничего не сделала (она была настроена на 'onload', а не' in head') - исправлено здесь: https://jsfiddle.net/9nnrt7hp/3/ – Jamiec

ответ

2

Вы совершили ошибку, проверяя равенство 2 объектов, проверите равенство каждого свойства объекта - это не так!

Вы не указали в вопросе, но из кода мы можем видеть, что объекты вы проверяете выглядеть примерно так:

centroidNew = { 
     cx: xRight, 
     cy: yMidTop 
    }; 

И у вас есть массив из тех, которые вы ищете для с петлей.

Тест if (a[i] === obj) { никогда не оценивать к истине, если a[0] и obj не ссылки на тот же объект.

Чтобы исправить это, вы можете явно ПРЫ свойства, так как есть только 2 из них это, вероятно, работает для вас

if (a[i].cx === obj.cx && a[i].cy === obj.cy) { 

Вот обновление вашей скрипки: https://jsfiddle.net/9nnrt7hp/4/ и теперь он иногда регистрирует true от этот тест.

+0

wow, Спасибо, я смотрю сам , но есть ли способ в javascript сравнить объекты для равенства ценности, не сравнивая их свойства? – Snedden27

+0

@ Snedden27 не является автоматическим, нет – Jamiec

Смежные вопросы