繁体   English   中英

如何找到数组中所有元素出现的索引(Ramda.js方式)?

[英]How to find index of all occurrences of an element in array (Ramda.js way)?

我试图找到所有实例的索引让我们说一个数组中的HeaderFooter

var arr = [
'data',
'data',
'data',
'data',
'Header',
'data',
'data',
'data',
'Footer',
'data',
'Header',
'data',
'Footer',
'data'
];

我知道如何在普通JS中做到这一点( 如何找到数组中所有元素出现的索引? ),但我想知道如何在FP中完成它,特别是ramda.js

我知道如何为第一个实例R.findIndex(R.test(_regexForHeader))执行此操作,但无法绕过循环遍历所有数组。 感谢帮助。

@ pierrebeitz的答案很明确,即当你在迭代列表时需要访问索引时,你通常会将列表与其索引一起压缩。 Ramda提供了一个R.addIndex函数,用于修改map等函数,以便在迭代时提供索引以及每个元素。

如果您愿意,他的示例中的嵌套也可以用合成管道替换:

const zipWithIndex = addIndex(map)(pair);

const isHeaderOrFooter = either(equals('Header'), equals('Footer'));

const hfIndices = pipe(
  zipWithIndex,
  filter(pipe(head, isHeaderOrFooter)),
  map(nth(1))
);

hfIndices(arr);

使用这两种方法时要注意的一件事是,您最终会多次迭代列表。 对于小型列表而言,这通常不会成为问题,但是对于较大的列表,您可能需要考虑使用R.into ,它可以有效地融合地图并一起过滤到一个传感器,现在只需要在列表上进行一次传递(参见http://simplectic.com/blog/2015/ramda-transducers-logs/为换能器提供了一个很好的介绍。

这可以通过在上面的例子中对hfIndices进行小的调整来实现,方法是将组合物从pipe交换到compose (换能器函数以相反的顺序组成)并将其包装into

const hfIndices = into([], compose(
  zipWithIndex,
  filter(pipe(head, isHeaderOrFooter)),
  map(nth(1))
));

我不是FP,但我相信你必须“生成”你想要使用的数据。 你必须添加一个索引,然后应用你的过滤器:

 var arr = ['data', 'data', 'data', 'data', 'Header', 'data', 'data', 'data', 'Footer', 'data', 'Header', 'data', 'Footer', 'data'];

R.map((e) => e[1], 
  R.filter(val => val[0] == 'Header' || val[0] == 'Footer', 
    R.addIndex(R.map)((e, i) => [e,i], arr)
  )
);
// => [4, 8, 10, 12]

这不是最精细的解决方案,但它应该让你去!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM