Цикл Javascript для добавления к предыдущему значению, если текущее значение больше 10 - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь создать эту простую логику, в то время как я хочу, чтобы значение массива добавлялось к предыдущему значению.Например, код ниже, 18 должен нести 1 и добавить к 9, а 9 будет 10, затем нести один и добавить к 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 голосов
/ 30 сентября 2018

Это может быть не самый эффективный способ, чтобы первый номер правильно отображался для двузначных чисел, я сделал что-то вроде ниже.

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));
0 голосов
/ 28 сентября 2018

Еще один способ сделать это следующим образом:

Этого можно достичь, используя правильный синтаксис карты массива.Я изменил ваш код, чтобы получить ожидаемый результат.Пожалуйста, найдите код ниже:

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

Я думаю, это то, что вы ожидаете.

0 голосов
/ 28 сентября 2018

Вам нужно перебрать массив с конца и обратить массив в начало и в конец.

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);
0 голосов
/ 28 сентября 2018

Еще один способ сделать это - это

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));
0 голосов
/ 28 сентября 2018

Вы должны отобразить с переносом:

  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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...