Используйте массив javascript для уменьшения заданных n входов, чтобы получить m выходов

У меня есть ряд пунктов, которые я хочу изменить в ряд линий.

это пример того что я хочу чтобы код делал

[p1, p2, p3] -> [line1, line2]

каждый цикл:

(p1, p2) -> line
(p2, p3) -> line

Стандартный способ сделать это:

const triangle = [[0,0], [0,1], [1,2]]

const lines = []
for (let i = 1; i < triangle.length; ++i) {
  const slope = findSlopeFromPoints(...triangle[i - 1], ...triangle[i])
  const yIntercept = findYIntercept(...triangle[i], slope)
  lines.push({
    slope,
    yIntercept
  })
}

Это закрытие я могу использовать Array.prototype.reduce, Но гораздо сложнее рассуждать о

const initial = {
  array: [], // actual returned array we care about
  lastPoint: null // "triangle[i - 1]"
}
const linesR = triangle.reduce( (lines, point) => {
  if (lines.lastPoint === null)
    return { 
      ...lines, 
      lastPoint: point 
    }
  else {
    const slope = findSlopeFromPoints(...lines.lastPoint, ...point)
    const yIntercept = findYIntercept(...point, slope)
    lines.array.push({
      slope,
      yIntercept
    })
    lines.lastPoint = point
    return lines

  }
}, initial )

Короче говоря, есть ли лучший способ использовать уменьшить, чтобы объединить N входы в N - 1 выходы?

1 ответ

Решение

Конечно, используйте currentIndex аргумент для применения смещения. Ваша функция обратного вызова получает еще несколько аргументов 1, чем вы используете:

[{x:0, y:0}, {x:0, y:1}, {x:1, y:2}].reduce((lines, point, currentIndex, source) => {
  currentIndex < source.length -1 && lines.push({
    from: point,
    to: source[currentIndex + 1]
  }); 
  return lines;     
}, []);

1 см Array.prototype. reduce() для получения дополнительной информации.

Другие вопросы по тегам