Javascript 在不关心结果的情况下迭代列表中的两个元素?

Javascript iterate over two-elements in a list when not concerned about result?

假设我有一个像

这样的列表
let chain = [ 1, 9, 61, 798 ];

这些本质上是路由上的非规范化节点,我想在数据库中添加 edges。理想情况下,我正在寻找为列表中的每两个元素调用 addEdge(node,parent) 的东西。 我正在寻找执行此操作的 Ramda 方法。

它是否为混合带来了任何独特的能力?我想过使用核心 javascript、

中的 .reduceRight() 之类的东西
[ 1, 9, 61, 798 ].reduceRight( (acc,v) => {
  addEdge(acc,v);
  return v
}, undefined );

但在这种情况下,.reduceRight 正在返回一些东西,在 void-context 中使用它似乎很奇怪。有更好的方法吗?

您可以使用 R.aperture 生成包含给定大小的连续元素的新数组。

const nodes = [1, 9, 61, 798]
const edges = R.aperture(2, nodes)

console.log(edges) //=> [[1, 9], [9, 61], [61, 798]]
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>

然后您可以 mapforEach 遍历包含节点对的结果数组。

这是一个普通的 JavaScript 方法:

const range = (from, to) => {
  const output = []

  for (let i = from; i < to; i++)
    output.push (i)

  return output
}

const pairize = xs =>
  range (0, xs.length - 1)
  .map (i => [xs[i], xs[i + 1]])


const nodes = [1, 9, 61, 798]
const edges = pairize (nodes)

console.log (edges)