2017-09-29 1 views
0

文字列値を取って、それを何らかの基数(10進数、16進数、8進数、バイナリなど)で解釈する関数を書いています。実際の(10進)値を計算します。ここで私はに苦しんだ問題になります以下のコードだ、と:文字列中のリピートインスタンスの各インデックス値を分離/使用する方法

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

だから起こることを意味している私が合格であるnum'abc'、例えば)、および多数のベース(私たちは」あなたはHEXA_DECIMALを使用します)。 16進数'abc'の基数10相当は2748

162(10) + 161(11) + 160(12) = 2560 + 176 + 12 = 2748
であり、それが関数が生成するものであることを十分に確認してください。しかし、私が 'fff'を入力した場合、私は突っ込んでしまいます。私が取得:
162(15) + 162(15) + 162(15) = 3840 + 3840 + 3840 = 11520
ではなく、期待: .indexOf()のみ、最初のインスタンスのインデックスを返しますので、捕まる変数 digits.indexOf(digit):問題はどこから来ている私は実現
162(15) + 161(15) + 160(15) = 3840 + 240 + 15 = 4095

。今私は正しい指数を計算し、関数を意図した通りに動作させる正しいインデックス番号を得る方法を考え出している。実際

答えて

1

.map()はありがとう、あなたは以下のようにコードを変更した場合ので、それはトリックをやった

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

を動作するはず

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

をコールバックするためのインデックスを渡します! – Matt

関連する問題