CoffeeScript 中的 reduce() - 如何传递默认值?

reduce() in CoffeeScript - how do I pass a default value?

所以我最近一直在研究 CoffeeScript。到目前为止,从 JS 的过渡相当顺利,但现在我终于 运行 遇到了一个我真的想不通的问题。

我有这段 ES6:

function upcaseOddIndexes (arr, cha, ind) {
  if (ind % 2 === 0) {
     arr.push(cha.toUpperCase());
  } else {
     arr.push(cha);
  }
  return arr;
}

var string = "stringthing";
var upcasedString = string.split("")
                    .reduce((arr, cha, ind) => upcaseOddIndexes (arr, cha, ind), [])
                    .join("");

console.log(upcasedArray);

它的工作(返回一个新字符串,奇数索引处的字母大写)很好。 upcaseOddIndexes函数也没有问题。但是如何将空数组作为 initialValue 传递给 reduce()

我最好的猜测是

.reduce(arr, cha, ind -> upcaseOddIndexes arr, cha, ind) []

这给了我

.reduce(arr, cha, ind(function() {
  return upcaseOddIndexes(arr, cha, ind);
 }))([])

那是行不通的,因为 arr is not defined

我试过添加更多括号、逗号等等,但我总是遇到 unexpected , 或类似的东西。

我已经对 Google 进行了很好的翻找,但到目前为止还没有找到答案。有关于该主题的 this question,但它并没有真正帮助。

非常感谢 =)

您需要在对 reduce 的调用结束时指定逗号:

.reduce ((arr, cha, ind) ->
  upcaseOddIndexes arr, cha, ind
), []

您会找到一个 Javascript 到 Coffeescript 的转换器 here

您可以将 (arr, cha, ind) => upcaseOddIndexes (arr, cha, ind) 减少到 upcaseOddIndexes:

string = "stringthing"
upcasedString = string
.split ""
.reduce upcaseOddIndexes, []
.join ""

即转换为

var string, upcasedString;

string = "stringthing";

upcasedString = string.split("").reduce(upcaseOddIndexes, []).join("");

或不减少:

string = "stringthing"
upcasedString = string
.split ""
.reduce (arr, cha, ind) ->
  upcaseOddIndexes arr, cha, ind
, []
.join ""

即转换为

var string, upcasedString;

string = "stringthing";

upcasedString = string.split("").reduce(function(arr, cha, ind) {
  return upcaseOddIndexes(arr, cha, ind);
}, []).join("");