2015-09-15 17 views
0

Может ли кто-нибудь предложить реализацию, которая позволяет избежать eval, надеюсь, что используется регулярное выражение и выполняется в 6 строк или меньше? Это забавная проблема.Рекурсивно найти сумму цифр числа с RegEx и без Eval()

Входной сигнал: 12 => 3 Входной сигнал: 235 => 10 => 1

function baseNumber(n){ 
    var x = eval(n.toString().replace(/(\d)(?=\d)/g, '$1+')) 
    if(x>9){ 
    return baseNumber(x) 
    } else { 
    return x 
    } 
} 

ответ

0

Попробуйте литья n к String, используя String.prototype.split(), String.prototype.replace(), Array.prototype.splice(), Number(), do.. while петля

function baseNumber(n) {  
 
    var x = String(n).replace(/[^\d]/g, "").split(""), y = 0; 
 
    do { y += Number(x.splice(0, 1)) } while (!!x.length); 
 
    return y > 9 ? baseNumber(y) : y 
 
} 
 

 
console.log(baseNumber("abc12"), baseNumber("def235"))

2

Если вам нужно использовать регулярное выражение (вы также можете сделать то же самое без регулярных выражений и с помощью раскола)

function baseNumber(n){ 
    if (n > 9) 
     return baseNumber(n.toString().match(/(\d)/g).reduce(function(a, b) { return a + Number(b) }, 0)) 
    else 
     return n; 
} 

Уменьш делает подведение итогов. Матч возвращает массив совпадений (т.е. цифры)

Если вы хотите обрабатывать десятичные и отрицательные числа изменить if (n > 9) чек if (n.toString().length > 1)

0

Что об этом один:

var input = 235; 
while(input > 9) input = String(input).match(/[\d]/g).reduce(function(sum, currentValue) { 
    return sum + parseInt(currentValue); 
}, 0); 
console.log(input); 
Смежные вопросы