我正在编写代码在屏幕上使用 svg 绘制六边形网格,我使用单个六边形而不是图案的原因是我最终想让每个六边形成为一个对象来引用
我使用一些数学和点引用绘制了六边形。
因此,与其让事情变得复杂,不如尝试解释我的代码,这是我的代码 https://jsfiddle.net/Snedden27/9nnrt7hp/8/ ,
我的问题是 function drawHexAround(cent)//line 41 , 该函数假设用质心 '@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)
我不明白为什么这个条件结果总是为真,而在某些情况下它显然应该为假。
最佳答案
您犯了一个错误,即检查 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) {
这是您的 fiddle 的更新:https://jsfiddle.net/9nnrt7hp/4/它现在有时会从该测试中记录 true
。
关于javascript - 在 javascript 中检查条件的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33348592/