我正在尝试编写一个应返回6个元素的列表的函数。它应该使用一个空数组,一个“模式”,在这里必须“添加”,以及第三个参数,即后一个元素应该增加的数字(与之前的元素相比)。 例如,返回的数组可能类似于
[4, 6, 8, 10, 12, 14]
http://jsbin.com/vuvunotifu/edit?js,console
我在JsBin上进行了测试,但是在最后一个if块中似乎有一个stackoverflow(没有双关语)。不知道为什么。有人知道如何解决吗?
function getRandomInt(max){
return Math.floor(Math.random() * Math.floor(max));
}
function getSequence(array, mode, differBy){
if(mode === 'add'){
if (array.length >= 6){
return array;
}
if (array.length === 0){
array.push(getRandomInt(getRandomInt(20)));
getSequence(array, 'add', getRandomInt(2) + 1);
console.log(array)
}
if (array.length <= 5){
let arrayCopy = array;
let lastInArray = arrayCopy.pop();
array.push(lastInArray + differBy);
getSequence(array, 'add', differBy);
}
}
}
console.log(getSequence([], 'add'));
答案 0 :(得分:1)
问题是您没有在复制数组-您只是(基本上)设置了对同一数组的另一个引用。因此[31mFailed to evaluate expression:
...[0m
也会更改变量arrayCopy.pop()
的显示,从而使array
永远不会增长。
要更正您的代码(使其与代码尽可能接近),可以使用array
来制作数据的实际副本。
或者,更简单的解决方案是使用array.slice()
设置lastInArray
。
请参见
https://medium.com/@naveenkarippai/learning-how-references-work-in-javascript-a066a4e15600
和
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
答案 1 :(得分:0)
let arrayCopy = array;
实际上不是在复制数组,因此当您弹出一个项目时,它只是从原始数组中消失了。数组的长度根本不增加。您完全不需要弹出该项目。
function getSequence(array, mode, differBy){
if(mode === 'add'){
if (array.length >= 6){
return array;
}
if (array.length === 0){
array.push(getRandomInt(getRandomInt(20)));
getSequence(array, 'add', getRandomInt(2) + 1);
console.log(array)
}
if (array.length <= 5){
let lastInArray = array[array.length-1];
array.push(lastInArray + differBy);
getSequence(array, 'add', differBy);
}
}
}
getSequence([], 'add');
答案 2 :(得分:0)
共享代码的问题出在let arrayCopy = array;
,这里不是创建新数组,而是将arrayCopy
引用到同一数组,所以当您pop()
这一个,它也pop()
另一个。
要使用另一个数组的副本创建一个新数组,应使用array.slice()
。更改似乎可以使您的代码正常工作。