你如何在 Ramda 中保留列表的第 k 个元素?

How do you keep the every kth element of a list in Ramda?

如何使用 Ramda 过滤掉列表中的第 k 个元素?

input = [1, 2, 3, 4, 5, 6, 7, 8, 9]

output = keepKth(input, 3)

output = [1, 4, 7]

这似乎有效:

  let k = 3;
  let Kth = (value, index) => (index % k == 0)
  let filterKth = R.addIndex(R.filter)(Kth);

  let input = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  let output = filterKth(input);

可能不是最干净的,但是免费的。

const data = [1, 2, 3, 4, 5, 6, 7, 8, 9];

const whitelist = R.addIndex(R.reject)(R.flip(R.modulo(R.__, 3)));

console.log(
  whitelist(data),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.2/ramda.js" integrity="sha512-MEPRnhl9ArIiZuk6ikVrLzYxQm8ov1Ngkn4kIUO82hwpD7d+cwXQ7+isupqVgZ6HHtAEBDMff8eUhzixwEBSbA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

基于 Scott 评论的变体:

const keepEvery = k => compose(pluck(0), splitEvery(k));

keepEvery(3)([1, 2, 3, 4, 5, 6, 7, 8, 9]);
//=> [1, 4, 7]

这是另一种基于R.unfold的方法。种子是索引(初始为 0),并且在每次迭代时递增 k

const { curry, unfold } = R

const fn = curry((k, arr) => unfold(n => n < arr.length && [arr[n], n + k], 0))

const data = [1, 2, 3, 4, 5, 6, 7, 8, 9]

const result = fn(3, data)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.2/ramda.js" integrity="sha512-MEPRnhl9ArIiZuk6ikVrLzYxQm8ov1Ngkn4kIUO82hwpD7d+cwXQ7+isupqVgZ6HHtAEBDMff8eUhzixwEBSbA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>