如何 isolate/use 字符串中重复实例的每个索引值
How to isolate/use each index value of repeat instances in a string
我正在编写一个函数,该函数应该采用字符串值,将其解释为某种基数(十进制、十六进制、八进制、二进制等)的数字,并计算其实际(十进制)值。这是代码,下面是我正在努力解决的问题:
const Alphabet = {
BINARY: '01',
OCTAL: '01234567',
DECIMAL: '0123456789',
HEXA_DECIMAL: '0123456789abcdef',
ALPHA_LOWER: 'abcdefghijklmnopqrstuvwxyz',
ALPHA_UPPER: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
ALPHA: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
ALPHA_NUMERIC: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
}
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
)。十六进制数 'abc'
的 base-10 等价物是 2748
:
16<sup>2</sup>(10) + 16<sup>1</sup>(11) + 16<sup>0</sup>(12) = 2560 + 176 + 12 = 2748
果然,这就是函数将产生的结果。但是,如果我输入 'fff'
,我就遇到了麻烦。我得到:16<sup>2</sup>(15) + 16<sup>2</sup>(15) + 16<sup>2</sup>(15) = 3840 + 3840 + 3840 = 11520
而不是预期的:16<sup>2</sup>(15) + 16<sup>1</sup>(15) + 16<sup>0</sup>(15) = 3840 + 240 + 15 = 4095
我意识到问题出在哪里:变量 digits.indexOf(digit)
被捕获,因为 .indexOf()
只有 returns 第一个实例的索引。现在我一直想弄清楚如何获得正确的索引号,这将计算出正确的指数并使函数按预期工作。
实际上.map()
将索引传递给回调
var new_array = arr.map(function callback(currentValue, index, array) {
// Return element for new_array
}[, thisArg])
因此,如果您像下面这样修改代码,它应该可以工作
const digitAmt = digits.map(function(digit, index) {
return fromBase.indexOf(digit) * (fblen ** ((digits.length - 1) - index));
});
我正在编写一个函数,该函数应该采用字符串值,将其解释为某种基数(十进制、十六进制、八进制、二进制等)的数字,并计算其实际(十进制)值。这是代码,下面是我正在努力解决的问题:
const Alphabet = {
BINARY: '01',
OCTAL: '01234567',
DECIMAL: '0123456789',
HEXA_DECIMAL: '0123456789abcdef',
ALPHA_LOWER: 'abcdefghijklmnopqrstuvwxyz',
ALPHA_UPPER: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
ALPHA: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
ALPHA_NUMERIC: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
}
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
)。十六进制数 'abc'
的 base-10 等价物是 2748
:
16<sup>2</sup>(10) + 16<sup>1</sup>(11) + 16<sup>0</sup>(12) = 2560 + 176 + 12 = 2748
果然,这就是函数将产生的结果。但是,如果我输入 'fff'
,我就遇到了麻烦。我得到:16<sup>2</sup>(15) + 16<sup>2</sup>(15) + 16<sup>2</sup>(15) = 3840 + 3840 + 3840 = 11520
而不是预期的:16<sup>2</sup>(15) + 16<sup>1</sup>(15) + 16<sup>0</sup>(15) = 3840 + 240 + 15 = 4095
我意识到问题出在哪里:变量 digits.indexOf(digit)
被捕获,因为 .indexOf()
只有 returns 第一个实例的索引。现在我一直想弄清楚如何获得正确的索引号,这将计算出正确的指数并使函数按预期工作。
实际上.map()
将索引传递给回调
var new_array = arr.map(function callback(currentValue, index, array) {
// Return element for new_array
}[, thisArg])
因此,如果您像下面这样修改代码,它应该可以工作
const digitAmt = digits.map(function(digit, index) {
return fromBase.indexOf(digit) * (fblen ** ((digits.length - 1) - index));
});