2017-09-29 6 views
0

J'écris une fonction supposée prendre une valeur de chaîne, l'interpréter comme un nombre dans une base (décimale, hexadécimale, octale, binaire, etc. .) et calcule sa valeur réelle (décimale). Voici le code, et ci-dessous sera la question que je me bats avec:Comment isoler/utiliser chaque valeur d'index des instances de répétition dans une chaîne

const Alphabet = { 
    BINARY:  '01', 
    OCTAL:   '', 
    DECIMAL:  '', 
    HEXA_DECIMAL: 'abcdef', 
    ALPHA_LOWER: 'abcdefghijklmnopqrstuvwxyz', 
    ALPHA_UPPER: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
    ALPHA:   'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 
    ALPHA_NUMERIC: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 
} 

function getValue(num, fromBase) { 
    const fblen = fromBase.length; 
    const digits = num.toString().split(''); 
    const digitAmt = digits.map(function(digit) { 
    return fromBase.indexOf(digit) * (fblen**((digits.length - 1) - digits.indexOf(digit))); 
    }); 
    return digitAmt.reduce(function(n, m) { 
    return n + m; 
    }); 
} 

console.log(getValue('fff', Alphabet.HEXA_DECIMAL)) 

donc ce qui est censé se produire est que je passe un num (par exemple, 'abc'), et la base du nombre (nous » ll utilisera HEXA_DECIMAL). L'équivalent en base 10 du nombre hexadécimal 'abc' serait 2748:

162(10) + 161(11) + 160(12) = 2560 + 176 + 12 = 2748
et bien sûr, c'est ce que la fonction produira. Toutefois, si je saisis 'fff', j'ai rencontré un problème. Je reçois:
162(15) + 162(15) + 162(15) = 3840 + 3840 + 3840 = 11520
plutôt que prévu:
162(15) + 161(15) + 160(15) = 3840 + 240 + 15 = 4095

j'ai réalisé où le problème provient de: la digits.indexOf(digit) variables se fait prendre parce que .indexOf() renvoie l'index de la première instance. Maintenant, je suis coincé à trouver comment obtenir le bon numéro d'index, qui va calculer l'exposant correct et faire fonctionner la fonction comme prévu.

Répondre

1

En fait .map() passe index callback

var new_array = arr.map(function callback(currentValue, index, array) { 
    // Return element for new_array 
}[, thisArg]) 

Donc, si vous modifiez votre code comme ci-dessous, il devrait fonctionner

const digitAmt = digits.map(function(digit, index) { 
    return fromBase.indexOf(digit) * (fblen ** ((digits.length - 1) - index)); 
    }); 
+0

qui a fait l'affaire, merci !! – Matt