Javascript перебирать два элемента в списке, когда не беспокоит результат? - PullRequest
0 голосов
/ 29 декабря 2018

Допустим, у меня есть список типа

let chain = [ 1, 9, 61, 798 ];

Это, по сути, денормализованные узлы на маршруте, и я хочу добавить ребер в базу данных.В идеале я ищу что-то, что вызывает addEdge(node,parent) для каждых двух элементов в списке. Я ищу способ Рамды сделать это.

Приносит ли это какую-то уникальную способность к миксу?Я думал об использовании чего-то вроде .reduceRight() из основного javascript,

[ 1, 9, 61, 798 ].reduceRight( (acc,v) => {
  addEdge(acc,v);
  return v
}, undefined );

Но в этом случае .reduceRight возвращает что-то и кажется странным использовать это в пустом контексте.Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Вот подход ванильного 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)
0 голосов
/ 29 декабря 2018

Вы можете использовать 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 по результирующему массиву, содержащему пары узлов.

...