为啥在 JS 的 reduce 数组方法中将布尔值附加到我的当前值?
Posted
技术标签:
【中文标题】为啥在 JS 的 reduce 数组方法中将布尔值附加到我的当前值?【英文标题】:Why is the boolean value being appended to my current value in a reduce array method in JS?为什么在 JS 的 reduce 数组方法中将布尔值附加到我的当前值? 【发布时间】:2022-01-06 19:16:51 【问题描述】:我很惊讶为什么在我的 reduce 功能中将布尔值附加到当前值。
var romanToInt = function (s)
const DICT =
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
let reversedArr = s.split('').reverse()
reversedArr
return reversedArr.reduce((sum, cur, i, arr) =>
let value = DICT[cur]
// check if preceeding numeral subtracts
if ((arr[i] += arr[i - 1] === 'VI') && i != 0)
sum -= value
else
// Set sum as the first
sum += value
return sum
, 0)
console.log(romanToInt('III'))
为什么这个表达式(curr += arr[i - 1] === 'VI')
的计算结果为假、真、真?
3 次迭代后 curr 的值为Ifalse, Ifalse, Ifalse
。这是怎么回事?
我要做的就是检查当前值是否与前面的值等于字符串'VI'
【问题讨论】:
检查 Operator_Precedence developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 【参考方案1】:x += y
等价于 x = x + y
,并且 整个赋值表达式 的计算结果为右侧的值:x + y
。如果x + y
为真,则整个结果表达式将为真。
出于同样的原因,您的
if ((arr[i] += arr[i - 1] === 'VI') && i != 0)
没有按照你的想法做。
看起来您根本不需要在这里分配数组索引 - 只需 比较 那里,如果满足条件,则更改 sum
(不更改内部的任何其他内容循环)。
var romanToInt = function (s)
const DICT =
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
const reversedArr = s.split('').reverse();
return reversedArr.reduce((sum, cur, i, arr) =>
let value = DICT[cur]
// check if preceeding numeral subtracts
if ((arr[i] + arr[i - 1] === 'VI') && i != 0)
sum -= value
else
// Set sum as the first
sum += value
return sum
, 0)
console.log(romanToInt('III'))
但是您仍然有办法修复算法的其余部分。 This 是个好方法。
【讨论】:
【参考方案2】:更短的版本;)
const romanToInt = (function()
const
DICT = I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000
, Narr = [ 'IV','IX', 'XL', 'XC', 'CD', 'CM' ]
;
return (str) =>
[...str].reverse().reduce((sum, curr, i, [i-1]:prev) =>
sum + (Narr.includes(`$curr$prev`) ? -DICT[curr] : DICT[curr]) , 0);
)()
console.log('III', romanToInt('III'))
console.log('IV', romanToInt('IV'))
console.log('VII', romanToInt('VII'))
console.log('IX', romanToInt('IX'))
【讨论】:
以上是关于为啥在 JS 的 reduce 数组方法中将布尔值附加到我的当前值?的主要内容,如果未能解决你的问题,请参考以下文章