2017-03-07 4 views
4

Ich habe eine Reihe von Punkten, die ich in eine Reihe von Zeilen ändern möchte. Verwenden Sie Javascript-Array reduzieren gegeben n Eingänge, um m Ausgänge

dies ist ein Beispiel dafür, was ich an den Code will

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

jede Schleife:

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

Der üblicher Weg, dies zu tun ist:

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 
    }) 
} 

Dies ist die Schlüsse kann ich mit Array.prototype.reduce bekommen. Aber es fühlt sich sehr viel schwieriger zu

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) 

Kurz auf Grund gibt es einen besseren Weg, N Eingänge in N - 1 Ausgänge zu kombinieren, verwenden zu reduzieren?

+0

Was ist Ihre Frage? –

+0

fügen Sie bitte ein gewünschtes Ergebnis und die Datenstruktur hinzu. –

+0

Entschuldigung, ich aktualisierte die Frage – andykais

Antwort

1

Sicher, verwenden Sie das Argument currentIndex, um einen Offset anzuwenden. Ihre Rückruffunktion empfängt mehrere Argumente als Sie verwenden:

[{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;  
}, []); 

Siehe Array.prototype. reduce() für weitere Informationen.

+0

wenn Punkte sind außerhalb des Arrays definiert, könnte ich https://jsfiddle.net/qxdsgddu/ – seveibar

+1

@seveibar sicher, aber wenn wir so weit gehen, würde ich sagen, überspringen die Array-Methoden insgesamt und nur Schleife. Wir werden sowieso nicht viel von 'reduce()' abheben, viel weniger vom Kopieren einer Teilmenge des Arrays zur Verarbeitung. Auf jeden Fall ist dies nur eine konzeptionelle Demo. – canon

Verwandte Themen