Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我该如何防止这最后一次;“破损状态”;从被推到阵列_Javascript_Arrays_While Loop_Slice - Fatal编程技术网

Javascript 我该如何防止这最后一次;“破损状态”;从被推到阵列

Javascript 我该如何防止这最后一次;“破损状态”;从被推到阵列,javascript,arrays,while-loop,slice,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.') } e

我正在动态切片一个数组,我可以通过使用
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
    }
}
理想情况下,我们的输出如下所示:

[3, 1, 0], [1, 0, 0], [0, 0, 1]]
使用我的当前代码,并且不使用
arr.pop()
,我的算法将始终潜入一个额外的切片迭代,其长度小于我的条件要求的长度(在本例中,
num==3

这将是我的输出:

[[3, 1, 0], [1, 0, 0], [0, 0, 1], [0, 1]]
我知道有很多方法可以做到这一点,但为此,我希望保持代码的完整性,因此使用我的实现的解决方案将是非常好的:D

编辑:我了解添加最后一个元素的原因。由于前面的元素满足条件(它的长度等于num),它将继续下一次迭代,但我如何在不使用.pop()的情况下雄辩地处理它


编辑:谢谢大家的回答!它们看起来都很管用,但Peter B的实现非常干净,特别是考虑到他只为我修改了几行,效果非常好。再次感谢

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

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

函数片(数组,n){
var结果=[],
开始=0;

while(start+n您正在检查
while
中的错误条件。最好计算您将在
while
中添加多少子数组(除了您开始使用的子数组),然后计算到该数字,如下所示:

[3, 1, 0], [1, 0, 0], [0, 0, 1]]
var数字=[3,1,0,0,1];
函数片(num){
设arr=[this.digits.slice(0,num)]
设i=0
if(this.digits.length
Description 我相信您正在寻找与此类似的东西?如您所见,我还删除了一些冗余代码,即在此场景中使用
while
循环和
else
子句

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

函数片(数字,num){
常数arr=[];
如果(位数.lengthconsole.log(切片(d,3));
你真的很接近了。我认为我在这里提出的解决方案保留了你的基本想法。你遇到的问题是检查
arr[I].length
等于
num
表示这只是检查您添加到数组中的最后一项,而不是下一项。请检查您要添加的项

this.digits=[3,1,0,0,1];
函数片(num){
设arr=[]
设i=0
if(this.digits.length