从最后一个元素到第一个元素添加到数组

时间:2019-07-07 19:53:58

标签: javascript

我需要一些帮助来修改或创建一个函数来完成简单的任务;

这是我的功能:

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]

另一个问题是我无法从最后一个元素到第一个元素添加到数组...

编辑:该如何解决?

4 个答案:

答案 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));