我正在动态切片一个数组,我可以通过简单地用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的实现非常简洁,特别是考虑到他只为我更改了几行内容,并且就像一个魅力一样。再次感谢!
答案 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));