javascript - 在 javascript 中检查条件的奇怪行为

标签 javascript

我正在编写代码在屏幕上使用 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/

相关文章:

javascript - 为什么这个表达式在 querySelectorAll 中是非法的

javascript - 全屏切换在 iOS 手机/平板电脑(Safari、Chrome 和 Firefox)上不起作用

javascript - Jquery - 多个模糊事件和输出值

javascript - 需要居中整个导航栏,包括子菜单,找不到正确的代码。我的 JavaScript 搞砸了吗?

javascript - 按下按钮时 react 导航不起作用

javascript - 我怎样才能用Javascript赚到2.5%?

javascript - 将集合映射到 upsert 到数据库中。如何批量更新插入?

多维数组中对象的 JavaScript 碰撞检测

javascript - 使用 javascript 阻止 iframe 加载页面

javascript - 为 Angular 指令添加多个 'require' 选项