在 Ramda.js 中,为什么必须使用恒等式才能使 `R.countBy()` 起作用?
In Ramda.js, why must use identity to get `R.countBy()` to work?
如果这是重复的,我深表歉意。我没有在其他地方找到答案。
Ramda.js 提供了 countBy()
功能。从文档中我们可以看到:
const R = require("ramda")
const letters = ['a', 'b', 'A', 'a', 'B', 'c'];
R.countBy(R.toLower)(letters); //=> {'a': 3, 'b': 2, 'c': 1}
但是如果我们已经有了小写的 letters
怎么办?也就是说,我们不需要任何额外的步骤,而只是计算。例如,假设我想简单地计算 letters2
数组:
const letters2 = ["a", "a", "a", "a", "b", "b", "c", "c", "c", "c"]
R.countBy(letters2) // doesn't work
相反,我们必须添加一些标识表达式,例如:
R.countBy(x => x)(letters2)
// gives {"a": 4, "b": 2, "c": 4}
或
R.countBy(R.identity)(letters2)
其他 Ramda 函数(例如 R.isNil()
)并非总是如此。我试图了解身份的这一额外步骤从何而来。对我来说似乎没有必要,但我可能遗漏了一些东西。
谢谢!
原因是 ramda 根本没有对您希望如何计算列表做出任何假设...
const list = ['A', 'b', 'c', 'D', 'e', 'f', 'g', 'G', 'F'];
// simply count
console.log(
R.countBy(R.identity, list),
)
// or count case insensitively
console.log(
R.countBy(R.toLower, list),
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.js" integrity="sha512-ZZcBsXW4OcbCTfDlXbzGCamH1cANkg6EfZAN2ukOl7s5q8skbB+WndmAqFT8fuMzeuHkceqd5UbIDn7fcqJFgg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
此外,不要忘记您可以利用部分应用程序来构建您的功能。
注意措辞,countBy
好像 Ramda 想要被告知如何计数。但没有什么能阻止您建立自己的计数。
const count = R.countBy(R.identity);
console.log(count(list))
如果这是重复的,我深表歉意。我没有在其他地方找到答案。
Ramda.js 提供了 countBy()
功能。从文档中我们可以看到:
const R = require("ramda")
const letters = ['a', 'b', 'A', 'a', 'B', 'c'];
R.countBy(R.toLower)(letters); //=> {'a': 3, 'b': 2, 'c': 1}
但是如果我们已经有了小写的 letters
怎么办?也就是说,我们不需要任何额外的步骤,而只是计算。例如,假设我想简单地计算 letters2
数组:
const letters2 = ["a", "a", "a", "a", "b", "b", "c", "c", "c", "c"]
R.countBy(letters2) // doesn't work
相反,我们必须添加一些标识表达式,例如:
R.countBy(x => x)(letters2)
// gives {"a": 4, "b": 2, "c": 4}
或
R.countBy(R.identity)(letters2)
其他 Ramda 函数(例如 R.isNil()
)并非总是如此。我试图了解身份的这一额外步骤从何而来。对我来说似乎没有必要,但我可能遗漏了一些东西。
谢谢!
原因是 ramda 根本没有对您希望如何计算列表做出任何假设...
const list = ['A', 'b', 'c', 'D', 'e', 'f', 'g', 'G', 'F'];
// simply count
console.log(
R.countBy(R.identity, list),
)
// or count case insensitively
console.log(
R.countBy(R.toLower, list),
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.js" integrity="sha512-ZZcBsXW4OcbCTfDlXbzGCamH1cANkg6EfZAN2ukOl7s5q8skbB+WndmAqFT8fuMzeuHkceqd5UbIDn7fcqJFgg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
此外,不要忘记您可以利用部分应用程序来构建您的功能。
注意措辞,countBy
好像 Ramda 想要被告知如何计数。但没有什么能阻止您建立自己的计数。
const count = R.countBy(R.identity);
console.log(count(list))