for循环生成的二维JavaScript数组正在被上一个循环结果覆盖

2 dimensional JavaScript Array generated by for loop is being overwritten by last loop result

本文关键字:循环 数组 上一个 覆盖 结果 JavaScript for 二维      更新时间:2023-09-26

我正试图制作一个伪随机序列生成器,它只适用于线性反馈移位寄存器。我用JavaScript做这件事,因为这是我唯一知道的语言,我用HTML创建GUI。用户应该输入初始值,并获得原理图和伪随机序列本身。这是我的JavaScript代码:

var UserInput = document.getElementById('ulaz');
var Output = document.getElementById('izlaz');
//variable `data` is an array of objects which I used to store pictures of circuits
// and [taps][3] necessary for shift registers to give max possible length output
// before going into loop which is 2^n-1, where n (`bit` in my code) is number of 
//register blocks and number of digits in input value.
function pss (){
    var data = [
        {
            slika:"pic/2bit.png",
            tap:[0,1]
        },
        {
            slika:"pic/3bit.png",
            tap:[0,2]
        },
        {
            slika:"pic/4bit.png",
            tap:[0,3]
        },
        {
            slika:"pic/5bit.png",
            tap:[1,4]
        },
        {
            slika:"pic/6bit.png",
            tap:[0,5]
        },
        {
            slika:"pic/7bit.png",
            tap:[0,6]
        },
        {
            slika:"pic/8bit.png",
            tap:[1,2,3,7]
        },
        {
            slika:"pic/9bit.png",
            tap:[3,8]
        },
        {
            slika:"pic/10bit.png",
            tap:[2,9]
        },
        {
            slika:"pic/11bit.png",
            tap:[1,10]
        },
        {
            slika:"pic/12bit.png",
            tap:[0,3,5,11]
        },
        {
            slika:"pic/13bit.png",
            tap:[0,2,3,12]
        },
        {
            slika:"pic/14bit.png",
            tap:[0,2,4,13]
        },
        {
            slika:"pic/15bit.png",
            tap:[0,14]
        },
        {
            slika:"pic/16bit.png",
            tap:[1,2,4,15]
        },
        {
            slika:"pic/17bit.png",
            tap:[2,16]
        },
        {
            slika:"pic/18bit.png",
            tap:[6,17]
        },
        {
            slika:"pic/19bit.png",
            tap:[0,1,4,18]
        },
        {
            slika:"pic/20bit.png",
            tap:[2,19]
        },
        {
            slika:"pic/21bit.png",
            tap:[1,20]
        },
        {
            slika:"pic/22bit.png",
            tap:[0,21]
        },
        {
            slika:"pic/23bit.png",
            tap:[4,22]
        },
        {
            slika:"pic/24bit.png",
            tap:[0,2,3,23]
        },
        {
            slika:"pic/25bit.png",
            tap:[2,24]
        },
        {
            slika:"pic/26bit.png",
            tap:[0,1,5,25]
        },
        {
            slika:"pic/27bit.png",
            tap:[0,1,4,26]
        },
        {
            slika:"pic/28bit.png",
            tap:[2,27]
        },
        {
            slika:"pic/29bit.png",
            tap:[0,28]
        },
        {
            slika:"pic/30bit.png",
            tap:[0,3,5,29]
        },
        {
            slika:"pic/31bit.png",
            tap:[2,30]
        },
        {
            slika:"pic/32bit.png",
            tap:[1,5,6,31]
        }
    ];
    var first = UserInput.value.split("");
        for (k=0;k<first.length;k++) first[k] = +first[k]; 
               //first is just UserInput separated in one char strings than parsed to integers
    var bit = first.length - 2;
          // I subtracted 2 here so I can access objects from data
    var matrix = [first];
    var t = 0;
    var between;
    var z;
    for (i=1; i<Math.pow(2, bit+2)-1; i++){     //here is that 2^n-1. +2 is because i had -2 before. For loop is starting from 1 and ending with <2^n-1 because i already have first array of matrix
        for (j=0; j<data[bit].tap.length; j++){
            z = data[bit].tap[j];
            t = t ^ matrix[i-1][z];
        }      // this for makes "t" which is all taps XOR-ed. If user input was 101, tap would be [0,2] and t would be 1xor1=0
        between = matrix[i-1];
            console.log(between);
        between.unshift(t);
        between.pop();
        matrix[i] = between;
        t=0;    // here Im "shifting registers" or just placing t in front of last generated row and removing its last digit, thus generating new row 
    }   
console.log(matrix);
}

这是HTML,所以你可以运行它。

变量data是一个对象数组,我用它来存储移位寄存器在进入2^n-1的循环之前给出最大可能长度输出所需的电路和抽头的图片,其中n(我代码中的bit)是寄存器块的数量和输入值中的位数。

所以问题是:记录最后生成的行的console.log(between);都是正确的,除了,因为它显示了最后生成的,所以没有最后一行,但与应该记录完整矩阵的console.log(matrix)相比,它显示了被最后一行覆盖的所有行。所以对于用户输入101,矩阵应该是

101
010
001
100
110
111
011

但只是

011
011
011 ...

如果console.log(between);之前的零件都好的话,我想不出它出了什么问题。。。

p.S.代码还没有完成,它不会用HTML显示解决方案,并且仍然需要从矩阵的最后一列生成数组的函数的一部分,这是伪随机序列。

我意识到var between指的是与var矩阵[I-1]相同的数组,而不是一个新的独立数组。

between = matrix[i-1];

所以,如果你只想存储矩阵[i-1]的值,而不是创建引用,你可以这样做:

between = JSON.parse(JSON.stringify(matrix[i-1]));

在js中,当您在某个变量中复制数组时,默认情况下会创建该数组的引用。有很多方法可以避免这种情况,你可以在这里找到很多例子。

我不知道为什么,但我已经找到了一个解决方案(当我有空的时候会调查更多)。

for (i=1; i<Math.pow(2, bit+2)-1; i++){     //here is that 2^n-1. +2 is because i had -2 before. For loop is starting from 1 and ending with <2^n-1 because i already have first array of matrix
    for (j=0; j<data[bit].tap.length; j++){
        z = data[bit].tap[j];
        t = t ^ matrix[i-1][z];
    }      // this for makes "t" which is all taps XOR-ed. If user input was 101, tap would be [0,2] and t would be 1xor1=0
    between = matrix[i-1];
    console.log(between);
    between.unshift(t);
    between.pop();
    // MODIFICATION
    var between_string = between;
    matrix[i] = between_string.join(); // Turn it to a string
    matrix[i] = matrix[i].split(','); // Turn it back to array to keep it working on the for loop above.
   // END MODIFICATION
    t=0;    // here Im "shifting registers" or just placing t in front of last generated row and removing its last digit, thus generating new row 
}   

现在,当你在控制台中打印它时,它会向你显示一个双向数组,尽管这很奇怪,但有时(在我的控制台上)它会显示int数字,有时还会与字符串数字混合(尊重between的原始值)。

编辑:我试着只使用"101"作为输入。

第二次编辑:好吧,我感到羞愧,它之所以返回[1,"0","0"](例如)是因为"1,0,0"的split(',')(只有两个数字前面有comas)。哈哈。很抱歉