用三元运算符减少JavaScript

时间:2019-06-27 14:19:04

标签: javascript ecmascript-6

我有一段代码可以正常工作。 此代码在数字数组中寻找最大值。 有人可以将其转换为简单的JavaScript(无三元),以便新手程序员可以理解它吗?

  const mostVotes = votes.reduce((bestIndex, v, i, arr) => v > arr[bestIndex] ? i : bestIndex, 0);

起初,我试图实现Math.max,但是我需要数组中最大值的索引,因此我追求了reduce和 这就是我试图做的。

const mostVotes = votes.reduce((acc, value, i, arr) => {
  if(value > acc) {
    return i
  }
}, 0)

感谢您的回答,不胜感激!我开始理解这一点,现在更加清楚了。 Javascript reduce和三元语法在一起很合适。

3 个答案:

答案 0 :(得分:1)

本质上,您提供的代码正在遍历votes中的每个元素,并检查它是否大于存储在特定索引处的元素。该索引存储在变量bestIndex中,用于标记/保留跟踪的索引,该索引包含循环时看到的所有元素中最大的元素。

在您的示例中,您的三元组正在检查给定元素是否大于当前标记的最大元素(通过执行v > arr[bestIndex])。在这种情况下,我们然后将当前元素的索引设置为最大元素的新位置(通过隐式返回i)。如果不是这种情况,则通过隐式返回bestIndex来保留最大元素的索引。

您可以使用for循环和if语句将其转换为更具程序化的编程风格:

let votes = [-4, 10, 100, -3, 40];

let positionOfMax = 0;
for(let i = 0; i < votes.length; i++) {
  if(votes[i] > votes[positionOfMax]) {  // v > arr[bestIndex]
    positionOfMax = i; // ? i (from ternary)
  }
  /* Not needed
    else {posittionOfMax = positionOfMax} // : bestIndex (from ternary)
  */
}
console.log(positionOfMax);

我鼓励您查看.reduce()conditional (ternary) operator上的文档。它们既有用又强大,可以帮助加快开发速度。

答案 1 :(得分:-1)

原始代码可能令人困惑的是缺少括号{}

() => 'test'() => { return 'test' }

在您的情况下:

(bestIndex, v, i, arr) => v > arr[bestIndex] ? i : bestIndex

(bestIndex, v, i, arr) => {
  return (v > arr[bestIndex] ? i : bestIndex)
}

(bestIndex, v, i, arr) => {
  if(v > arr[bestIndex])
    return i
  else 
    return bestIndex
}

const mostVotes = votes.reduce((bestIndex, v, i, arr) => {
  if(v > arr[bestIndex])
    return i
  else 
    return bestIndex
}, 0);

答案 2 :(得分:-1)

下面的if/else应该可以将您带到想要的地方。

if (v > arr[bestIndex]) {
  return i
} else {
  return bestIndex
}