JavaScript中的push()方法不能正常工作

5

我试图编写一个非常简单的程序,将一个数组分成另一个由定义大小的小数组组成的数组,但是push()方法不起作用。 能否有人帮助我解决这个问题?

function chunk(array, size) {
  var newArray = [];
  var tempArray = [];

  for (let i = 0; i < array.length / size; i++) {
    for (let j = size * i, k = 0; j < size * i + size; j++, k++)
      tempArray[k] = array[j];

    newArray.push(tempArray);
  }

  return newArray;
}

var data = [1, 2, 3, 4, 5, 6, 7, 8];

console.log(chunk(data, 2));

理想输出应该是 [[1, 2],[3, 4], [5, 6], [7, 8]]。 但是我得到了[[7,8],[7,8],[7,8],[7,8]]

2
var tempArray = []; 移至你的第一个 for 循环内部。目前,你每次都在推入相同的数组引用,因此对它所做的修改会影响到数组内部。 - Nick Parsons
1
你只在一开始创建了一个 temparray,然后覆盖其元素并多次推送相同的数组。 - derpirscher
3个回答

6
你已经接近成功了。只需将 tempArray 定义放到第一个 for 循环内部即可。否则,你会每次都推入相同的数组。
工作示例:

function chunk(array, size) {
  const newArray = [];

  for (let i = 0; i < array.length / size; i++) {
    const tempArray = [];
    for (let j = size * i, k = 0; j < size * i + size; j++, k++)
      tempArray[k] = array[j];

    newArray.push(tempArray);
  }

  return newArray;
};

const data = [1, 2, 3, 4, 5, 6, 7, 8];

console.log(chunk(data, 2)); // [[1, 2],[3, 4], [5, 6], [7, 8]]


4

@Behemoth的回答对这个问题是正确的。但如果你想的话,你也可以采取稍微不同的方法来得出解决方案。

function chunk(array, size){
    const newArray = [];
    let i,j;
    
    for (i = 0,j = array.length; i < j; i += size) {
      newArray.push(array.slice(i, i + size));
    }
    return newArray;
};

var data = [1, 2, 3, 4, 5, 6, 7 ,8];

console.log(chunk(data, 2));


3

与@Behemoth和@Rukshan提供的解决方案略有不同

function chunk(array, size) {
  var newArray = [];
  var tempArray = [];

  for (let i = 0; i < array.length / size; i++) {

    for (let j = i; j < i + 1; j++) {
      for (let k = 0; k < size; k++) {
        if (array[size * j + k]) {
          tempArray.push(array[size * j + k]);
        }
      }
      newArray.push(tempArray);
      tempArray = [];
    }
  }
  return newArray;
};

var data = [1, 2, 3, 4, 5, 6, 7, 8];

console.log(chunk(data, 2));

解决方案应该是[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9 ] ],而不是[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ] ]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接