问答

js 二维数组赋值后有undefined

作者:admin 2021-08-03 我要评论

function GAInitPop() { Chrom = new Array(); for(var ik=0; ik10; ik++){ //一维长度为 Chrom1[ik] = randperm(7); console.log(Chrom[ik]); } console.log(Ch...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
function GAInitPop() {
  Chrom = new Array();
  
  for(var ik=0; ik<10; ik++){        //一维长度为
    Chrom1[ik] = randperm(7);
    console.log(Chrom[ik]);
  }
  
  console.log(Chrom);
  return Chrom
}


//建立从1到num的整数数组并乱序排列
function randperm(num) {
  var randarr=new Array();
    for(var ir = 0; ir < num; ir ++){
      randarr[ir] = ir+1;
    }
  randarr.shuffle();
  return randarr;
}



//Array洗牌
Array.prototype.shuffle = function() {    
  var j, tmp, i;
  for(i = this.length-1; i>0; i--){    
    j = parseInt(Math.random() * i);       
    tmp = this[i]; 
    this[i] = this[j]; 
    this[j] = tmp;
      }
}

Chrom = GAInitPop();
console.log(Chrom)

我希望得到一个10行7列的二维数组
在单独测试时能正常得到,但放在有其他功能的网页里面就会像图中只有最后一行有数据,为什么呢
image

###

Chrom1 是什么?就暂且当你写错了,我当它是 Chrom

然后看你说测试的时候正常,但是放到网页中就有问题了。
那么就说说什么情况会导致这个问题

  1. 因为是引用地址。所以如果有其他位置修改会出现这样的问题。
  2. 这种给最后赋值的问题,很熟悉,那就是闭包。

    1. for 循环中绑定事件,然后事件中赋值
    2. for 循环中使用setTimeout
###

@linong

function GAInitPop() {
  Chrom1 = new Array();

  for(let ik=0; ik<10; ik++){        //一维长度为
    Chrom1[ik] = randperm(CityNum);
  }
  return Chrom1;
}


//建立从1到num的整数数组并乱序排列
function randperm(num) {
  var randarr=new Array();
    for(var ir = 0; ir < num; ir ++){
      randarr[ir] = ir+1;
    }
  randarr.shuffle();
  return randarr;
}



//Array洗牌
Array.prototype.shuffle = function() {    
  var j, tmp, i;
  for(i = this.length-1; i>0; i--){    
    j = parseInt(Math.random() * i);       
    tmp = this[i]; 
    this[i] = this[j]; 
    this[j] = tmp;
    }
}

Chrom = GAInitPop();
console.log(Chrom)

又改了下,像上面这样在for里用let能正确输出Chrom
我是最近才学到js是单线程的,然后我又试了下面的代码,一个函数里有两层for,用let和settimeout就都不好使了,console.log(Chrom1)还是会出现undefined,这种应该怎么处理呢

var TravelCon = 100;
var Capacity = 1;

function GAVRPInitPop() {  
  Chrom1 = new Array();
  for(let i=0; i<10; i++) {
    Chrom1[i] = new Array();

  
    var TSProute = new Array();
    TSProute = randperm(CityNum);

    TSProute.unshift(0);
    TSProute.push(0);


    var VRProute = new Array();
    for (let j=0; j<7; j++) {
      VRProute[j] = 0;  //置零
    }
    
    var DisTraveled = 0;
    var delivery = 0;

    var k = 0;
    for (let j=1; j<=CityNum+1; j++) {
      k++;
      if (DisTraveled+distance[VRProute[k-1]][TSProute[j]]+distance[TSProute[j]][0]>TravelCon || delivery+demand[TSProute[j]] > Capacity){
        VRProute[k] = 0;
        //再去下一个城市
        DisTraveled = distance[0][TSProute[j]];
        delivery = demand[TSProute[j]];
        k++;
        VRProute[k] = TSProute[j];

      }
      else{
        DisTraveled += distance[VRProute[k-1]][TSProute[j]];
        delivery += demand[TSProute[j]];
        VRProute[k] = TSProute[j];        
      }

    }
    Chrom1[i] = VRProute;
  }
  console.log(Chrom1)
  return Chrom1;
}

//建立从1到num的整数数组并乱序排列
function randperm(num) {
  var randarr=new Array();
    for(var ir = 0; ir < num; ir ++){
      randarr[ir] = ir+1;
    }
  randarr.shuffle();
  return randarr;
}



//Array洗牌
Array.prototype.shuffle = function() {    
  var j, tmp, i;
  for(i = this.length-1; i>0; i--){    
    j = parseInt(Math.random() * i);       
    tmp = this[i]; 
    this[i] = this[j]; 
    this[j] = tmp;
    }
}

var Chrom = GAVRPInitPop();
console.log(Chrom)

其中distance为二维数组,存放节点之间的距离;demand为一维数组,存放需求量
其实代表什么不是重点,重点是执行GAVRPInitPop()前有代码没执行完,所以要将含双层for的GAVRPInitPop()异步处理

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • js   二维数组赋值后有undefined

    js 二维数组赋值后有undefined

  • Jupyter notebook 上这个带百分比的语

    Jupyter notebook 上这个带百分比的语

  • 求个大佬给写个存储过程-&gt;oracl

    求个大佬给写个存储过程-&gt;oracl

  • 字符串有换行符如何转成对象

    字符串有换行符如何转成对象

腾讯云代理商
海外云服务器