Используйте 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 )
Короче говоря, есть ли лучший способ использовать reduce для объединения входов 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()
.