【问题标题】:Ramda 'when' not producing expected resultRamda 'when' 没有产生预期的结果
【发布时间】:2019-12-13 08:32:24
【问题描述】:

我期望 arrayTester 查看数组中的每个数组,如果两个元素都是空字符串,以便将它们从数组中删除。相反,我正在取回原始数组。

预期结果 = [[], ['string', '']]

实际结果 = [['',''], ['string', '']]

有什么想法吗?

let data = [['',''], ['string', '']]
const emptyString = R.equals('')
const removeEmptyElementsFunc = R.reject(R.isEmpty)
const arrayTester = (data) => {
 R.forEach(
        R.when(
          R.all(emptyString),
          R.map(removeEmptyElementsFunc)
        )(data))
        return data
      }

arrayTester(data)

【问题讨论】:

  • 你不想使用forEach
  • @Bergi 删除 forEach 时结果相同。
  • 我的意思是你会想要mapdata 不会被任何东西改变,你创造了新的价值,但把它们扔掉了。
  • 请不要使用缩短的 URL。使用它们的唯一原因是当您可以发布的字符数受到限制时。在 Stack Overflow 问题和答案中,情况并非如此。使用缩短的 URL 会使链接看起来很邪恶,因为它们通常用于隐藏恶意软件链接、跟踪链接(例如您使用的链接)或隐藏垃圾邮件等。

标签: functional-programming ramda.js


【解决方案1】:

如果您需要将一个空字符串数组映射到一个空数组,您唯一需要做的就是确保它确实只由空字符串组成。 (“转换”相当简单:只返回一个空数组。)

all(isEmpty) 将返回 true 如果数组由空的东西组成。 always([]) 将始终返回一个空数组。

const arrayTester = map(when(all(isEmpty), always([])));

console.log(

  arrayTester([['', ''], ['a', 'b', '']]),
  arrayTester([['', '', ''], ['a', 'b', '']]),
  arrayTester([['', 'x', ''], ['a', 'b', '']])
  
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {map, when, all, isEmpty, always} = R;</script>

【讨论】:

  • 好吧,我不知道每个数组中有多少个空字符串。因此,我需要查看每个数组,看看整个东西是否由空字符串组成。我应该在我的问题中更清楚地说明这一点。
  • 别担心,我会相应地更新。如果一个数组由空字符串组成,除了一个,例如['', '', 'a', '']。需要保持数组完整还是过滤掉空字符串?
  • 保持数组完整
猜你喜欢
  • 2015-04-20
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2017-05-22
  • 2016-08-10
  • 1970-01-01
相关资源
最近更新 更多