为啥在 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 数组方法中将布尔值附加到我的当前值?的主要内容,如果未能解决你的问题,请参考以下文章

JS数组reduce()方法详解及高级技巧

JS 使用reduce进行数组去重

JS数组reduce()方法详解及高级技巧

JS 数组reduce()方法详解及高级技巧

JS数组reduce()方法

JS数组reduce()方法详解及高级技巧