如何防止最后的“中断条件”被推送到数组

时间:2019-01-29 15:36:20

标签: javascript arrays while-loop slice

我正在动态切片一个数组,我可以通过简单地用arr.pop()删除最后一个元素来获得所需的功能,但是我想确切地知道为什么我的while循环将其添加到数组中当它破坏了我的条件时。

slices(num){
    let arr = [this.digits.slice(0, num)]
    let i = 0
    if (this.digits.length < num){
            throw new Error('Slice size is too big.')
    } else {
        while (arr[i].length === num){
            i++
            arr.push(this.digits.slice(i, num + i))
        }
        // arr.pop() - removed for testing
        return arr
    }
}

这里是一个例子。假设我们要切片此数组:

this.digits = [ 3, 1, 0, 0, 1 ]

理想情况下,我们的输出将如下所示:

[3, 1, 0], [1, 0, 0], [0, 0, 1]]

使用我当前的代码并且不使用arr.pop(),我的算法将始终潜行于一个额外的slice迭代中,该迭代的长度小于我的条件所要求的长度(在这种情况下为num == 3

这是我的输出:

[[3, 1, 0], [1, 0, 0], [0, 0, 1], [0, 1]]

我知道有很多方法可以做到这一点,但是为此,我想保持代码的完整性,因此使用我的实现的解决方案将是不错的:D

编辑:我知道为什么要添加最后一个元素。由于之前的元素满足条件(其长度等于num),因此它将继续进行下一次迭代,但是我如何雄辩地处理它而不使用.pop()

编辑:谢谢大家的回答!他们似乎都可以工作,但是Peter B的实现非常简洁,特别是考虑到他只为我更改了几行内容,并且就像一个魅力一样。再次感谢!

4 个答案:

答案 0 :(得分:2)

您正在检查while中的错误情况。最好计算要在while内添加多少个子数组(除了开始时要添加的子数组),然后计算到该数量,如下所示:

var digits = [3, 1, 0, 0, 1];

function slices(num) {
  let arr = [this.digits.slice(0, num)]
  let i = 0
  if (this.digits.length < num) {
    throw new Error('Slice size is too big.')
  } else {
    var sliceCutoff = this.digits.length - num;
    while (i < sliceCutoff) {
      i++
      arr.push(this.digits.slice(i, num + i))
    }
    return arr
  }
}

console.log(slices(3));

答案 1 :(得分:1)

您需要检查剩余项是否足以获取所需长度的数组。这意味着,您需要一个循环并连续检查实际的ster索引,所需的大小和长度。

不需要检查拼接后的最后一个数组的方法,因为它会产生可避免的开销。

function slice(array, n) {
    var result = [], 
        start = 0;
    
    while (start + n <= array.length) {
        result.push(array.slice(start, start++ + n));
    }
    return result;
}

var array = [3, 1, 0, 0, 1];

console.log(slice(array, 3));

答案 2 :(得分:1)

说明

我相信您正在寻找与此类似的东西?如您所见,我还删除了一些冗余代码,即在这种情况下使用while循环和else子句。

我也刚刚将digits声明为该演示的参数,我相信您可以主动将其更改为您的应用程序需求,而无需太多/任何操作帮助。

function slices(digits, num) {
  const arr = [];

  if (digits.length < num)
    throw new Error('Slice size is too big.')

  for (let i = 0; i != num; i++)
    arr.push(digits.slice(i, num + i));

  return arr;
}

var d = [3, 1, 0, 0, 1]; // Only here for the demo.
console.log(slices(d, 3));

答案 3 :(得分:1)

您真的很亲密。我认为我在这里提出的解决方案保留了您的总体想法。您遇到的问题是,检查arr[i].length是否等于num意味着这仅是检查您添加到数组中的最后一项,而不是下一项。相反,请检查您要添加的项目。

this.digits = [ 3, 1, 0, 0, 1 ];

function slices(num) {
    let arr = []
    let i = 0
    if (this.digits.length < num) {
            throw new Error('Slice size is too big.')
    } else {
        while (this.digits.slice(i, num + i).length === num){
            arr.push(this.digits.slice(i, num + i))
            i++
        }
        // arr.pop() - removed for testing
        return arr
    }
}

console.log(slices(3));