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>
然后您可以 map
或 forEach
遍历包含节点对的结果数组。
这是一个普通的 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)
假设我有一个像
这样的列表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>
然后您可以 map
或 forEach
遍历包含节点对的结果数组。
这是一个普通的 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)