我不明白这个解决方案

时间:2019-08-23 09:36:48

标签: javascript

我首先指出该代码有效。那不是问题!我只是不明白到底是怎么回事。据我了解,chunked.push方法一直在广告一个新数组。但显然不是。它给出了正确的答案: [[1,2],[3,4],[5]]

我根本不理解这段代码中发生了什么。它会给出正确的答案,并在必要时在每个数组中放置几个​​项目,但是代码每次都会创建一个新的子数组,不是吗?不,显然不是-但我不明白为什么?请帮忙!

function chunk(array, size) {
  let workArr = [...array];
  let chunked = [];
  for (let i = 0; i < workArr.length; i++) {
    let last = chunked[chunked.length - 1];
    if (!last || last.length === size) {
      chunked.push([workArr[i]])
    } else {
      last.push(workArr[i]);
    }
  }
  return chunked;
}

以下是一些输入参数和预期结果的示例:

// chunk([1, 2, 3, 4], 2) --> [[ 1, 2], [3, 4]]
// chunk([1, 2, 3, 4, 5], 2) --> [[ 1, 2], [3, 4], [5]]
// chunk([1, 2, 3, 4, 5, 6, 7, 8], 3) --> [[ 1, 2, 3], [4, 5, 6], [7, 8]]
// chunk([1, 2, 3, 4, 5], 4) --> [[ 1, 2, 3, 4], [5]]
// chunk([1, 2, 3, 4, 5], 10) --> [[ 1, 2, 3, 4, 5]]

1 个答案:

答案 0 :(得分:1)

让我们打破它

这将复制一个数组,并在其中使用了散布运算符

  let workArr = [...array];

遍历workArr数组中的每个项目

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

  }

我认为这会在初次运行时给您undefined,因为-1中的索引chunked上没有任何内容(因为起初chunked.length是{{1} }),但会将0设置为last数组的最后一个元素

chunked

如果let last = chunked[chunked.length - 1]; 的值为假(last0nullundefined""NaN)或false的长度等于last(请注意,size应该是数组或字符串),然后将last数组的第i个元素(索引从0开始)放入将workArr数组作为数组,否则将元素从chunked推入workArr,但是last应该是数组

last

然后只需返回if (!last || last.length === size) { chunked.push([workArr[i]]) } else { last.push(workArr[i]); } 数组

chunked