我需要一些帮助来修改或创建一个函数来完成简单的任务;
这是我的功能:
function arra(sum, length){
var array = [];
for(let i = 0; i < length; i++) {
array.push(0);
}
//console.log(array)
for(let i = 0; i < sum; i++){
array[i] ++
}
return array;
}
console.log(arra(0, 7));
console.log(arra(3, 7));
console.log(arra(7, 7));
console.log(arra(10, 7));
首先,我们创建一个带有length
的数组,然后将0
推入其中的每个元素。因此该数组将为:[0, 0, 0, 0 ,0 ,0 ,0]
然后基于sum
的值,我想从array
的最后一个元素开始添加1。问题是我想回到第一个元素,如果有足够的sum
,继续加1。
因此,如果我执行以下操作:arra(3, 7);
我将拥有:[0, 0, 0, 0 ,1 ,1, 1]
如果我执行此操作:arra(7, 7)
,我将拥有:[1, 1, 1, 1 ,1 ,1 ,1]
但是问题是当我执行此操作时:arra(10, 7)
我得到了:[1, 1, 1, 1, 1, 1, 1, NaN, NaN, NaN]
这是意外的。我想要:[1, 1, 1, 1 ,2 ,2 ,2]
另一个问题是我无法从最后一个元素到第一个元素添加到数组...
编辑:该如何解决?
答案 0 :(得分:6)
如果要“环绕”,则可以使用长度模数array[i%length]
为数组建立索引。如果您想从另一端开始,则可以从array[length - 1 - i % length]
中减去-我不清楚您想要哪个顺序,但是相同的想法可以通过以下两种方式起作用:
function arra(sum, length){
var array = Array(length).fill(0)
//console.log(array)
for(let i = 0; i < sum; i++){
array[length - 1 - i % length] ++
}
return array;
}
console.log(arra(0, 7));
console.log(arra(3, 7));
console.log(arra(7, 7));
console.log(arra(10, 7));
答案 1 :(得分:3)
由于您使用length值初始化了数组,因此您得到了[1, 1, 1, 1, 1, 1, 1, NaN, NaN, NaN]
,在这种情况下,您正在调用arra(10,7)
for(let i = 0; i < length; i++) {
array.push(0);
}
在这里,您将获得一个由7个元素组成的数组,这些数组被初始化为0
[0,0,0,0,0,0,0]
接下来执行:
for(let i = 0; i < sum; i++){
array[i] ++
}
在初始化为0的前7个元素中,您将获得1;但是在接下来的3个元素中,您将获得NaN
为什么?
由于array[i]
是undefined
并且; undefined
和运算符++
强制转换为NaN
。
如果要创建圆形数组:
let array = null;
function circularArray(sum, length) {
array = Array(length).fill(0);
for (let count = 0; count < sum; count++) {
array[count % array.length]++;
}
}
circularArray(10, 7);
console.log(array.reverse());
答案 2 :(得分:2)
您可以计算出分散的最小值和最大值,并获得右侧部分的长度。
function getArray(sum, length) {
var max = Math.ceil(sum / length),
min = Math.floor(sum / length),
l = sum - min * length;
return Array.from({ length }, (_, i) => length - i > l ? min : max);
}
console.log(...getArray(0, 7));
console.log(...getArray(3, 7));
console.log(...getArray(7, 7));
console.log(...getArray(10, 7));
console.log(...getArray(20, 7));
答案 3 :(得分:1)
您可以从头开始,然后在第一个元素达到1时重新设置为结束。
function arra(sum, length){
var array = [];
for(let i = 0; i < length; i++) {
array.push(0);
}
let x = length -1;
while(sum > 0) {
if(x < 0) { // go back to the end
x = length -1;
}
array[x]++;
x--;
sum--;
}
return array;
}
console.log(arra(0, 7));
console.log(arra(3, 7));
console.log(arra(7, 7));
console.log(arra(10, 7));