Js没有正确添加数字

时间:2020-07-11 00:18:34

标签: javascript arrays math

我正在尝试制作一些将采用现有数组并使用变量向其添加数字的JS。问题是,它没有返回期望值。在element[0][1] += rows上,控制台返回了不应返回的值。例如,如果rows = 0;element[0][1] = 1;控制台返回: 2 。我认为这与我的嵌套数组有关,就像当我运行简单的代码时一样:

let x = 1;
let g = [1,2,3];
g[0] += x;
console.log(g[0]);

一切正常,预期响应已重新设置,但不确定。 任何帮助将不胜感激,我简化了代码以提供帮助!

编辑2: numberOfObjects是整数,表示需要x和y位置的元素数量

var slides = [
    [
        [ [1,1],[3,1] ] //element 0 (start[x,y], end[x,y])
    ], // slide 0;
    
    [
        [ [1,1],[2,1] ], // element 0
        [ [3,1],[3,1] ]  //element 1 
    ], //slide 1

    [
        [ [1,1],[2,1] ], // element 0
        [ [3,1],[3,2] ], // element 1
        [ [1,2],[2,2] ]  // element 2
    ], //slide 2
    
    [
        [ [1,1],[1,1] ], // element 0
        [ [1,2],[1,3] ], // element 1
        [ [1,2],[2,3] ], // element 2
        [ [3,2],[3,3] ]  // element 3
    ], //slide 3
    
    [
        [ [1,1],[1,2] ], // element 0
        [ [2,1],[2,2] ], // element 1
        [ [3,1],[3,2] ], // element 2
        [ [1,3],[1,3] ], // element 3
        [ [2,3],[3,3] ]  // element 4
    ], //slide 4
    
    [
        [ [1,1],[1,1] ], // element 0
        [ [2,1],[2,1] ], // element 1
        [ [3,1],[3,2] ], // element 2
        [ [1,2],[2,2] ], // element 3
        [ [1,3],[1,3] ], // element 4
        [ [2,3],[3,3] ]  // element 5
    ]  //slide 5
]

function getRandomInt(max) {
    return Math.floor(Math.random() * Math.floor(max));
  }

function collectSlides(numberOfObjects){

    
    //const N = numberOfObjects;
    var rows = 0;

    console.log("At row:"+rows);
    while (numberOfObjects > 0){
        if (numberOfObjects < 7){
            console.log("finished");
            numberOfObjects == 0;
        }
        else{
            let x = getRandomInt(6);
            let slide = slides[x];

            slide.forEach(element => {
                //console.log("org:"+element[0][1]);
                element[0][1] = rows;
                //console.log("aft:"+element[0][1]);
            });
            rows += (slide[slide.length-1][1][1] - rows);
            console.log(slide);
            numberOfObjects -= x;
        }
    }
}

编辑更多信息:

为简化起见,使用控制台调用了函数,但通常在页面加载事件中调用了函数。

预期结果,从函数返回的数组为我提供了生成的元素列表(上面列出的东西类似于2个元组),并带有更新的y坐标。

为什么?我计划使用css-grid制作一个页面,其中每个元素将跨越js给定的选定行和列。 here is an image of what each slide will do. collectSlides()函数的目标是从一张幻灯片中随机选取,然后将其添加到具有适当y坐标的retun数组中。

编辑2:将const N注释掉,因为它无关紧要

edit 3:为了重复结果,我使用this code中的Math.seedrandom("3232");,首先在HTML中插入带有脚本标签的seedrandom.min.js。我使用collectSlides(22)在控制台中调用该函数,并且当输出的第一个响应是(5) [Array(2), Array(2), Array(2), Array(2), Array(2)]上的witch下的element[0]时,您会发现0: (2) [1, 1] 1: (2) [1, 2]。给定代码0:(2)[1, 1 ](粗体数字)应为 0而不是1

1 个答案:

答案 0 :(得分:0)

问题是试图更改经过精心设计的数组中的数字。我不知道为什么它不起作用,但我对其进行了编码,以避免编辑现有数组的数字,并且现在可以使用。

const SEED = "3232";
const USESEED = true;

var slides = [
    [
        [ [1,1],[3,1] ] //element 0 (start[x,y], end[x,y])
    ], // slide 0;
    
    [
        [ [1,1],[2,1] ], // element 0
        [ [3,1],[3,1] ]  //element 1 
    ], //slide 1

    [
        [ [1,1],[2,1] ], // element 0
        [ [3,1],[3,2] ], // element 1
        [ [1,2],[2,2] ]  // element 2
    ], //slide 2
    
    [
        [ [1,1],[1,1] ], // element 0
        [ [1,2],[1,3] ], // element 1
        [ [1,2],[2,3] ], // element 2
        [ [3,2],[3,3] ]  // element 3
    ], //slide 3
    
    [
        [ [1,1],[1,2] ], // element 0
        [ [2,1],[2,2] ], // element 1
        [ [3,1],[3,2] ], // element 2
        [ [1,3],[1,3] ], // element 3
        [ [2,3],[3,3] ]  // element 4
    ], //slide 4
    
    [
        [ [1,1],[1,1] ], // element 0
        [ [2,1],[2,1] ], // element 1
        [ [3,1],[3,2] ], // element 2
        [ [1,2],[2,2] ], // element 3
        [ [1,3],[1,3] ], // element 4
        [ [2,3],[3,3] ]  // element 5
    ]  //slide 5
]

function getRandomInt(max) {
    return Math.floor(Math.random() * Math.floor(max));
  }

function collectSlides(numberOfObjects){

    if (USESEED){
        try{
            Math.seedrandom(SEED);
        }
        catch{
            alert(" this script requires seeded math.random functions from [https://github.com/davidbau/seedrandom] in order to create a replicable pattern. to disable this warning set USESEED = False");
        }
    } 

    var rows = 0;
    elements = [];
    while (numberOfObjects > 0){
        
        if (numberOfObjects < slides.length+1){
            slides[numberOfObjects].forEach(element => {
                let slide = [];
                let q1 = [element[0][0],(element[0][1]+rows)];
                let q2 = [element[1][0],(element[1][1]+rows)];
                slide.push(q1,q2);
                elements.push(slide);
            });
            rows = elements[elements.length-1][1][1]
            numberOfObjects -= numberOfObjects;
        }
        else{
            let x = getRandomInt(6);

            slides[x].forEach(element => {
                let slide = [];
                let q1 = [element[0][0],(element[0][1]+rows)];
                let q2 = [element[1][0],(element[1][1]+rows)];
                slide.push(q1,q2);
                console.log(slide)
                elements.push(slide);
            });
            rows = elements[elements.length-1][1][1]
            numberOfObjects -= x;
        }
    }
    return elements;
}