javascript - 未捕获的类型错误 : Cannot read property '0' of undefined at function

标签 javascript

这是一段代码,用于在某些条件下创建数字序列。一切正常,直到我添加这段代码:

for (let i = 0; i < slide_index; i++) {
  for (let j = 0; j <= i; j++) {
    slices[i] += arrays[j][i - j];
  }
}

  console.log(slices);

上面的代码创建了这个错误:

Uncaught TypeError: Cannot read property '0' of undefined at pack

主要代码如下:

    function arra(sum, length){
    
    var array = [];
    var float = 0;
    if(length == 1){array.push(sum)} else{  
    for (let i = 0; i < length; i++) {
        let a = 0; // the very first element of array
        // Math equations
        let last = (sum - (length / 2 * a)) * 2 / length
        let dd = (last - a) / (length - 1)
    
        sume = (dd * (i));
        if(float_part(sume) > 0.5){ sume = Math.ceil(sume) }        
        float += float_part(sume)
        array.push(int_part(sume));            
    }
    }
    // check to see if array elemements sum is equal to "var sum = 10"
    let reducer = (accumulator, currentValue) => accumulator + currentValue;
    let reducerlast = (accumulator, currentValue) => accumulator + currentValue;
    let sumlast = sum - (array.reduce(reducerlast));
    array[length - 1] += sumlast
    let sumArray = array.reduce(reducer);
    //console.log("sumArray: " + sumArray)
    
    return array // results
            
      function int_part(y){
      return Math.trunc(y);       
    }
    
    function float_part(d){
      let int_part = Math.trunc(d);          
      return Number((d-int_part).toFixed(2)); 
    }
    }
                            
    var arrays = [];
    var slices = [0, 0, 0, 0, 0];
    
    var total_slides = 5;  // total number of slides we have in the course
    var addMe = [];
    var total_standard_reviews = 60; 
    var a1 = 0;
    var outputArray = [];
    var min = 0;
    var diff = [];
    function pack(added_plans, slide_index){
    let reducer = (accumulator, currentValue) => accumulator + currentValue;
    let reducere = (accumulator, currentValue) => accumulator + currentValue;
    let reducerx = (accumulator, currentValue) => accumulator + currentValue;
    
     var j =  slide_index - 1;
     //console.log("j: " + slide_index)
      
    diff.push(added_plans);
    //console.log(diff)
    if(j > 0)  {
    min = diff[j] - diff[j - 1];
    console.log("min: " + min)
    arrays = arrays.concat([arra(min, total_slides - j)]);                   
    }
     // *******************  Here is the updated code *****************
    //console.log(arrays);
   for (let i = 0; i < slide_index; i++) {
         for (let j = 0; j < arrays.length; j++) {
          slices[i] += arrays[j][i - j];
    
  }
  
}
   
    console.log(slices);
     
    var total_reviews = (total_standard_reviews + added_plans);
    
    var next = [];
    var sum = 0;
    //
    
    
    var last = (total_reviews - (total_slides/2 * a1)) * 2/total_slides
    var d = (last - a1) / (total_slides - 1)
    
    for (let i = 1; i < total_slides; i++){
          sum += a1 + (d * ( i - 1));  
          var pusher = int_part(sum);
          next.push(pusher);
          sum -= pusher
             }  
      
      let sumer = total_reviews - (next.reduce(reducer));
      next.push(sumer) 
    //
      let sumerr = next.reduce(reducere);
      //console.log(sumerr)
      //console.log(next)
      if(slide_index < total_slides){
      var output = next[slide_index - 1]
      console.log("output: " + output) 
      outputArray.push(output)
    } else {
      var outputArraysum = outputArray.reduce(reducerx);
      output = total_reviews - outputArraysum ;
        console.log("output2: " + output)
    
    }
    
      function int_part(y){
      return Math.trunc(y);
    
    }
    
    function float_part(d){
      let int_part = Math.trunc(d);
      
      return Number((d-int_part).toFixed(2)); 
    }
    
    }
    
    pack(0, 1); 
    setTimeout(function(){ pack(5,2); }, 6000);
    setTimeout(function(){ pack(10,3); }, 9000);
    setTimeout(function(){ pack(15,4); }, 12000);
    setTimeout(function(){ pack(20,5); }, 14000);

请帮忙,我不明白为什么会发生这种情况以及如何解决它......

完全困惑:(

编辑:我在这里有一个该错误的简单代码:

    var slide_index = 3;
    var arrays = [];
    var slices = [0, 0, 0, 0, 0];
    //
    // our arrays
    var a = [1, 1, 1, 1, 1];
    //var b = [2, 2, 2, 2];
    //var c = [3, 3, 3];
    //var d = [4, 4];
    //var e = [5];
    
    // put all above arrays into one array
    arrays = arrays.concat([a]);
    //arrays = arrays.concat([b]);
    //arrays = arrays.concat([c]);
    //arrays = arrays.concat([d]);
    //arrays = arrays.concat([e]);
    console.log(arrays);
    for (let i = 0; i < slide_index; i++) {
      for (let j = 0; j <= i; j++) {
        slices[i] += arrays[j][i - j];
        
      }
      
    }
    console.log(slices);

我不知道如何修复它...当我将所有数组放入数组时它就可以工作!?

最佳答案

错误是因为 arrays 只是一个空数组。

发生这种情况是因为以下 block :

if(j > 0)  {
   min = diff[j] - diff[j - 1];
   console.log("min: " + min)
   arrays = arrays.concat([arra(min, total_slides - j)]);  
}

当你删除那个 if 时,你会得到输出..但也会得到一堆 NaN。

    function arra(sum, length){
    
    var array = [];
    var float = 0;
    if(length == 1){array.push(sum)} else{  
    for (let i = 0; i < length; i++) {
        let a = 0; // the very first element of array
        // Math equations
        let last = (sum - (length / 2 * a)) * 2 / length
        let dd = (last - a) / (length - 1)
    
        sume = (dd * (i));
        if(float_part(sume) > 0.5){ sume = Math.ceil(sume) }        
        float += float_part(sume)
        array.push(int_part(sume));            
    }
    }
    // check to see if array elemements sum is equal to "var sum = 10"
    let reducer = (accumulator, currentValue) => accumulator + currentValue;
    let reducerlast = (accumulator, currentValue) => accumulator + currentValue;
    let sumlast = sum - (array.reduce(reducerlast));
    array[length - 1] += sumlast
    let sumArray = array.reduce(reducer);
    //console.log("sumArray: " + sumArray)
    
    return array // results
            
      function int_part(y){
      return Math.trunc(y);       
    }
    
    function float_part(d){
      let int_part = Math.trunc(d);          
      return Number((d-int_part).toFixed(2)); 
    }
    }
                            
    var arrays = [];
    var slices = [0, 0, 0, 0, 0];
    
    var total_slides = 5;  // total number of slides we have in the course
    var addMe = [];
    var total_standard_reviews = 60; 
    var a1 = 0;
    var outputArray = [];
    var min = 0;
    var diff = [];
    function pack(added_plans, slide_index){
    let reducer = (accumulator, currentValue) => accumulator + currentValue;
    let reducere = (accumulator, currentValue) => accumulator + currentValue;
    let reducerx = (accumulator, currentValue) => accumulator + currentValue;
    
     var j =  slide_index - 1;
     //console.log("j: " + slide_index)
      
    diff.push(added_plans);
    console.log(diff)
    //if(j > 0)  {
    min = diff[j] - diff[j - 1];
    console.log("min: " + min)
    arrays = arrays.concat([arra(min, total_slides - j)]); 
     
      
    //}
    console.log(arrays)
      
    for (let i = 0; i < slide_index; i++) {
      for (let j = 0; j <= i; j++) {
        slices[i] += arrays[j][i - j];
      }
    }
      
    console.log(slices[slide_index - 1]);
    console.log(slices);
     
    var total_reviews = (total_standard_reviews + added_plans);
    
    var next = [];
    var sum = 0;
    //
    
    
    var last = (total_reviews - (total_slides/2 * a1)) * 2/total_slides
    var d = (last - a1) / (total_slides - 1)
    
    for (let i = 1; i < total_slides; i++){
          sum += a1 + (d * ( i - 1));  
          var pusher = int_part(sum);
          next.push(pusher);
          sum -= pusher
             }  
      
      let sumer = total_reviews - (next.reduce(reducer));
      next.push(sumer) 
    //
      let sumerr = next.reduce(reducere);
      //console.log(sumerr)
      //console.log(next)
      if(slide_index < total_slides){
      var output = next[slide_index - 1]
      console.log("output: " + output) 
      outputArray.push(output)
    } else {
      var outputArraysum = outputArray.reduce(reducerx);
      output = total_reviews - outputArraysum ;
        console.log("output2: " + output)
    
    }
    
      function int_part(y){
      return Math.trunc(y);
    
    }
    
    function float_part(d){
      let int_part = Math.trunc(d);
      
      return Number((d-int_part).toFixed(2)); 
    }
    
    }
    
    pack(0, 1); 
    setTimeout(function(){ pack(5,2); }, 6000);
    setTimeout(function(){ pack(10,3); }, 9000);
    setTimeout(function(){ pack(15,4); }, 12000);
    setTimeout(function(){ pack(20,5); }, 14000);

编辑

在那里我进行了两项更改...

1)我改变了内部循环以离开 array.length

2)我将其更改为:j < array.length 而不是 j <= array.length

    var slide_index = 3;
    var arrays = [];
    var slices = [0, 0, 0, 0, 0];
    //
    // our arrays
    var a = [1, 1, 1, 1, 1];
    //var b = [2, 2, 2, 2];
    //var c = [3, 3, 3];
    //var d = [4, 4];
    //var e = [5];
    
    // put all above arrays into one array
    arrays = arrays.concat([a]);
    //arrays = arrays.concat([b]);
    //arrays = arrays.concat([c]);
    //arrays = arrays.concat([d]);
    //arrays = arrays.concat([e]);
    console.log(arrays);
    for (let i = 0; i < slide_index; i++) {
      for (let j = 0; j < arrays.length; j++) {
      console.log(j);
      console.log(i);
      console.log(i - j);
        slices[i] += arrays[j][i - j];
        
      }
      
    }
    console.log(slices);

关于javascript - 未捕获的类型错误 : Cannot read property '0' of undefined at function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56923753/

相关文章:

javascript - 具有嵌套条件的 JSON 数据的 Angular 动态表单 View

javascript - 从下拉框中添加和选择选项值

javascript - 如何从 Wijmo 过滤 Flexgrid 中的日期

javascript - 在视口(viewport)中为单个元素添加类

javascript - 需要在angularjs中动态创建一个函数

javascript - JS - setAttribute() 不起作用

javascript - 为什么这个 hover addClass 不起作用?

javascript - MeteorJS 和 AmplifyJS 响应式(Reactive)

Javascript:日期取决于字段规范顺序?真的吗?

javascript - Istanbul 尔 : No coverage property. 跳过传感器的 Sonar 测试覆盖率