如果当前值大于10,则添加到先前值的Javascript循环

时间:2018-09-28 16:41:41

标签: javascript ecmascript-6

我试图创建这种简单的逻辑,而我希望将数组值添加到先前的值。例如下面的代码,18应携带1并加到9,而9将是10,然后携带1并加到7便是8,依此类推。我认为我走在正确的道路上,但我想不通。

这是我正在使用的附加数学生成器。

var foo = [7, 9, 18];
var bar =  foo.map(i=>{
  return i % 10
})

console.log(bar) // [7,9,8]  I want it to be [8,0,8]

5 个答案:

答案 0 :(得分:1)

您必须带一个进位图:

  let carry = 0;

  const result = [7, 9, 18].reverse().map(n => {
    n += carry;
    carry = Math.floor(n / 10);
    return n % 10;
 }).reverse();

要扩展进位溢出的结果,请添加:

 if(carry)
   result.unshift(...[...("" + carry)].map(Number));

答案 1 :(得分:0)

您需要从末尾迭代数组,并在开始和结束时对数组进行反向操作。

var array = [7, 9, 18],
    result = array
        .reverse()
        .map(
            (carry => value =>
                [carry += value, carry % 10, carry = Math.floor(carry / 10)][1])
            (0)
        )
        .reverse();

console.log(result);

要获取领先的进位价值,您可以使用另一种方法Array#reduceRight并进行一些扩展。

var array = [107, 9, 18],
    result = [];

result = [
    ...(array.reduceRight((c, v) => (result.unshift((c += v) % 10), c / 5 >> 1), 0) || '').toString() || [],
    ...result
].map(Number);

console.log(result);

答案 2 :(得分:0)

执行此操作的另一种方法是

const foo = [7, 9, 18];

const func = (arr) => {

    let q = 0;
    
    // Iterate from the end of the array with reduceRight
    
    let toReturn = arr.reduceRight((acc, val) => {
        
        // Add the previous q
        
        val += q;
        
        // Get the next q
        
        q = Math.floor(val / 10);
  
        return acc.concat(val % 10);
    }, []).reverse();
    
    // If there is a q add it to the array
    
    if (q) toReturn = [q, ...toReturn];

    return toReturn;
};

console.log(func(foo));

答案 3 :(得分:0)

另一种方法如下:

这可以通过使用适当的数组映射语法来实现。我已修改您的代码以获得预期的结果。请在下面找到代码:

var array1 = [7, 9, 18];

const customArr = array1.reverse().map((currentValue, index, arr) => {
    if(index < arr.length)
        arr[index+1] += Math.floor(currentValue / 10);
    return currentValue % 10;
 }).reverse();

console.log(customArr);

我认为,这就是您所期望的。

答案 4 :(得分:0)

这可能不是最有效的方法,为了使第一个数字正确显示两位数,我做了下面的事情。

const foo = [17, 9, 18];

const func = (arr) => {

    let q = 0;
    
    // Iterate from the end of the array with reduceRight
    
    let toReturn = arr.reduceRight((acc, val) => {
        
        // Add the previous q
        
        val += q;
        
        // Get the next q
        
        q = Math.floor(val / 10);
  
        return acc.concat(val % 10);
    }, []).reverse();
    
    // If there is a q add it to the array
    
    if (q) toReturn = [q, ...toReturn];
    if (q) {
          let sum = Number(toReturn.slice(0, 2).join(""))
          toReturn.shift();
          toReturn[0] = sum;

          return toReturn
       }
   
    return toReturn;
};

console.log(func(foo));