【问题标题】:Cannot read property 'push' of undefined multidimensional array无法读取未定义多维数组的属性“推送”
【发布时间】:2015-10-09 06:55:06
【问题描述】:

我正在尝试解决这个问题:编写一个函数,将数组(第一个参数)分成大小长度的组(第二个参数)并将它们作为多维数组返回。例如:

chunk(['a', 'b', 'c', 'd'], 2) 

应该返回

[['a'. 'b'], ['c', 'd']]

我的代码如下:

function chunk(arr, size) {
  var newArr = [[]];
  for(i = 0; i < arr.length; i++) {
    for(j = 0; j < size; j++) {
      newArr[i].push(arr[i + j]);
    }
  }
  return newArr;
}

它给出了一个错误:无法读取未定义的属性“push”。为什么会发生这种情况,我该如何解决?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您可以使用嵌套循环来做到这一点,但为什么不采用更简单的方法并使用array.slice()

    function chunk( input, size ) {
        var output = [];
        for( i = 0;  i < input.length;  i += size ) {
            output.push( input.slice( i, i + size ) );
        }
        return output;
    }
    

    【讨论】:

      【解决方案2】:

      之后

      for(i = 0; i < arr.length; i++) {
      

      你必须初始化一维数组:

      newArr[i] = [];
      

      这将解决错误,但不会产生您想要的结果。我认为你需要这样的东西:

      for (i = 0; i < ceil(arr.length / size); i++) {
          newArr[i] = [];
          for (j = 0; j < size; j++) {
              if (i * size + j >= arr.length)
                  break;
              newArr[i].push(arr[i * size + j]);
          }
      }
      

      【讨论】:

      • 有人能解释一下为什么第 5 行有中断吗?
      • 假设size = 3,但原来的arr有7个成员。最后一个“块”将仅包含 1 个元素 - 之后,将不再有成员来填充最后一个块中剩余的 2 个位置。这就是break 的用武之地。
      猜你喜欢
      • 2017-10-16
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      相关资源
      最近更新 更多