1

我有一个 javascript if-else 语句。它从 websocket 获取数据,并根据条件为真或假进入相关分支。

但我发现添加到两个数组的数据是相同的。这是代码:

    cities = JSON.parse(evt.data);
    if (cities.tag == 'red'){
        dataset.length = 0;
        console.log(cities.tag);
        for (var i = 0, item; item = buffer[i]; ++i) {
            buffer[i][1][0] = cities.clusters[item[0]] || 0;
            //console.log(buffer);
            dataset.push(buffer[i][1][0]);
            console.log('no1: ',dataset);  
        }
    }else{
        dataset2.length = 0;
        console.log(cities.tag);
        for (var i = 0, item; item = buffer2[i]; ++i) {
            buffer2[i][1][0] = cities.clusters[item[0]] || 0;
            dataset2.push(buffer2[i][1][0]);
            console.log('no2: ',dataset2);  
        }           
    }
    draw(); 

我知道它进入了正确的分支并且数据不同,但不知何故,else 分支中的代码只是复制了 if 分支中的数组。

我认为代码中一定有一些东西,但我看不到是什么。

谢谢

4

2 回答 2

1

慢慢阅读代码并考虑输入:

  • 对于缓冲区中项目的 每个item和索引:i
    • 如果前面的表达式没有定义,则设置buffer2[i][1][0]cities.clusters[item[0]]or 的值;0

但是你看,这里已经有问题了

如果缓冲区的任何给定级别的每个元素都应该是相同的类型,则 buffer2 是数组数组的数组。

这意味着item是一个数组数组,并且item[0]是一个数组,而不是一个元素。这并不意味着该语句不会以某种方式起作用,但是,除非您试图赢得某种 javascript 混淆竞赛,否则这不是好的代码,并且可能不是预期的。

编辑:这确实是一种奇怪的遍历数组的方式;也许在这个宇宙中存在某种理由以这种方式遍历数组,但如果您的数组中有任何元素会以某种方式评估为 false,它甚至不会遍历所有元素。

于 2012-12-17T17:02:27.480 回答
0

由于您显示了部分代码,因此无法完全理解您的代码。如果大部分代码是正确的,建议像这样交换 array.push:

dataset.push(cities.clusters[item[0]] || 0);

dataset2.push(cities.clusters[item[0]] || 0);

如果 buffer 和 buffer2 不相同,这应该可以工作。

于 2012-12-17T15:40:47.940 回答