js 二维数组赋值后有undefined

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

阅读 3.6k
2 个回答

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()异步处理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题