这个函数内部的if-else语句是如何工作的?

4

我一直在完成FreeCodeCamp上的挑战,偶然发现了这个算法的解决方案。但是无法理解此处的if else语句如何工作。

function chunkArrayInGroups(arr, size) {

  var temp = [];
  var result = [];

  for (var a = 0; a < arr.length; a++) {
    if (a % size !== size - 1)
      temp.push(arr[a]);
    else {
      temp.push(arr[a]);
      result.push(temp);
      temp = [];
    }
  }

  if (temp.length !== 0)
    result.push(temp);

  return result;
}

为什么在else块的末尾设置 temp = []

5个回答

6
temp = []的意思是“将temp变量重置为空数组”。
在if块中,arr[a]元素被推送到temp数组的末尾。
在else块中,同样的事情发生了,当前的整个temp数组被添加到大的result数组中,并且temp数组被重置为空数组。
由于您的问题中没有提供数据或上下文,所以无法再多做解释。希望这回答了您的问题。

2
似乎代码试图将一个数组分成大小为size的小数组块。假设你有一个装满苹果的大袋子,你想把它缩小到最多只有2个苹果的小袋子里。在现实生活中你会怎么做?你会从第一个苹果开始逐个检查并将它们放入一个小袋子中,直到它装满。然后你会移动到另一个小袋子并开始填充它。这里也是同样的做法。
if语句内部有一个条件检查,检查临时块是否已经被填满,如果没有,则继续推入当前临时数组。如果是,则创建一个新数组并继续向其中推入。temp=[]确保重置。

有趣的伪代码,但请注意我们检查最后一个苹果是否适合,如果是,则将其放入袋子并抓取新袋子。最后,我们检查我们的最后一个袋子是否不为空,并将其放入结果中。例如,如果我们将9个苹果分成2个袋子;) - Ron van der Heijden

2

这是@Peter Pavluchenko的代码。让我们来看看它在做什么。

调用者正在指定块的大小。

  • a%size!== size-1
    • %是一个模运算符。因此,当a除以size时结果是什么?结果不等于size-1吗?

如果“a”被除以size的结果不等于size-1,则将该项推送到我们的临时数组的末尾。

如果“a”被除以size的结果等于size-1,则找到了第一个块!因此,让我们将该项添加到我们的临时数组中,并将临时数组添加到我们的结果数组中。

临时数组 - 项目1 - 项目2

结果数组 - 项目 -- 项目1 -- 项目2

因此,当您执行result [0]时,将获得另一个数组。

chunk = result [0]; chunk [0] =您可能感兴趣的实际对象。

将临时数组推送到结果数组的末尾后,我们需要重置它,以便我们可以开始收集下一个块的项目。

最后一个“if”正在寻找诸如,您正在块的中间,但它不是由大小参数指定的整个块的情况。因此,我们在离开方法之前需要向结果数组添加一些对象到我们的临时数组中。


2
似乎任务是将给定的数组(arr)拆分为一个数组的数组,其中每个数组的长度为size-除非最后一个数组有任何“剩余项”,如果数组的长度不是size的精确倍数。
给定解决方案的工作方式是遍历arr,将其元素推入临时数组temp中。但是,每隔size步骤-这对应于for循环内的else条件-temp数组将具有正确的长度(即size),因此然后将整个temp数组作为单个元素附加到result数组中,然后返回为空数组以重新开始。
这样,result最终以所需的大小块大小结束。最终的if语句只是添加“剩余项”-也就是temp中剩下的任何东西。(但是我们检查它是否为空,否则如果长度是精确的倍数,则在result末尾会有一个不需要的空数组。)

2
该函数将数组分成小数组块,其中“size”参数定义了每个块数组的长度。 算法如下:
  • 迭代每个数组元素(for循环),直到主数组元素索引小于块数组大小(a%size!== size-1),并将元素推入临时数组。
  • 否则块 - 将元素推入temp数组,将temp数组推入结果数组并创建新的空temp数组();

    最后,如果temp数组的长度不为0,则也将其推入results数组。就是这样 :)


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