Das Erlernen dieser Fähigkeit Wenn Sie diese Eine der Schwierigkeiten besteht darin, den Typ von Beginnen wir mit der Festigung unseres Verständnisses und unserer Verwendung von Karte Gemäß den Tipps ist der endgültige Rückgabewert von /** * Verwenden Sie „reduce“, um die integrierte Methode „Array.prototype.map“ zu implementieren. * @param {any[]} arr * @param {(val: any, index: number, thisArray: any[]) => jede} Zuordnung * @returns {any[]} */ Funktion map(arr, Mapping) { return arr.reduce((acc, item, index) => [...acc, Zuordnung(item, index, arr)], []); } prüfen Karte([null, false, 1, 0, '', () => {}, NaN], val => !!val); // [falsch, falsch, wahr, falsch, falsch, wahr, falsch] Filter Den Tipps zufolge ist der endgültige Rückgabewert des /** * Verwenden Sie „reduce“, um die integrierte Methode „Array.prototype.filter“ zu implementieren. * @param {any[]} arr * @param {(val: any, index: number, thisArray: any[]) => boolean} Prädikat * @returns {any[]} */ Funktion Filter(arr, Prädikat) { return arr.reduce((acc, item, index) => Prädikat(item, index, arr) ? [...acc, item] : acc, []); } prüfen Filter([null, false, 1, 0, '', () => {}, NaN], Wert => !!Wert); // [1, () => {}] manche Funktion einige (arr, Prädikat) { return arr.reduce((acc, val, idx) => acc || Prädikat(val, idx, arr), false) } prüfen: einige([null, falsch, 1, 0, '', () => {}, NaN], val => !!val); // WAHR einige([null, falsch, 0, '', NaN], val => !!val); // FALSCH Zur Erinnerung: Die beiden haben keinen Einfluss auf das Ergebnis, weisen aber Leistungsunterschiede auf. Das Platzieren von acc an den Anfang ist ein Kurzschlussalgorithmus, der unnötige Berechnungen vermeiden kann und somit eine höhere Leistung aufweist. acc || Prädikat(val, idx, arr) Und Prädikat(Wert, Idx, Arr) || Acc jeder Wenn Funktion every(arr, Prädikat) { return arr.reduce((acc, val, idx) => acc und Prädikat(val, idx, arr), true) } Index suchen Wenn das Zielarray Funktion findIndex(arr, Prädikat) { const NOT_FOUND_INDEX = -1; return arr.reduce((acc, val, idx) => { if (acc === NICHT_GEFUNDENER_INDEX) { Prädikat (Wert, IDX, Arr) zurückgeben? IDX: NICHT GEFUNDENER INDEX; } Rückgabe gem. }, INDEX_NICHT_GEFUNDEN) } prüfen findIndex([5, 12, 8, 130, 44], (Element) => Element > 8) // 3 Rohr1. Implementieren Sie die folgenden Funktionen /** * Gibt eine Funktion zurück, um den Eingabewert von den bereitgestellten Funktionen der Reihe nach von links nach rechts verarbeiten zu lassen. * @param {(funcs: any[]) => beliebige} Funktionen * @returns {(arg: any) => any} */ Funktion Pipe(...Funktionen) {} Machen pipe(Wert => Wert * 2, Math.sqrt, Wert => Wert + 10)(2) // 12 Mit dieser Funktion können komplexere Verarbeitungsprozesse implementiert werden. // Wähle die Elemente aus, deren Wert positiv ist, multipliziere ihren Wert mit 0,1, addiere dann den Wert aller Elemente und erhalte schließlich 3 const Prozess = Pipe( arr => arr.filter(({ val }) => val > 0), arr => arr.map(Element => ({ ...Element, Wert: Element.Wert * 0,1 })), arr => arr.reduce((acc, { val }) => acc + val, 0) ); Prozess([{ Wert: -10 }, { Wert: 20 }, { Wert: -0,1 }, { Wert: 10 }]) // 3 2. Implementieren Sie die folgende Funktion, die die Funktion der obigen Pipe realisieren und eine Funktion zurückgeben kann, die eine unbestimmte Anzahl von Parametern akzeptiert. /** * Gibt eine Funktion zurück, die die Eingabewerte von den bereitgestellten Funktionen der Reihe nach von links nach rechts verarbeiten lässt. * @param {(funcs: any[]) => beliebige} Funktionen * @returns {(args: any[]) => any} */ Funktion Pipe(...Funktionen) {} Führen Sie den folgenden einzelnen Testdurchlauf durch pipe(Summe, Math.sqrt, Wert => Wert + 10)(0,1, 0,2, 0,7, 3) // 12 Unter ihnen wurde /** * Addieren Sie die Zahlen. * @param args Nummer[] * @returns {number} die Gesamtsumme. */ Funktion Summe(...args) { gibt args.reduce((a, b) => a + b); zurück } Referenzantwort 1. Rückgabe einer Funktion, die einen Parameter akzeptiertLassen Sie den Funktionsschritt zum Herausfiltern von Nichtfunktionen aus. /** * Gibt eine Funktion zurück, um den Eingabewert von den bereitgestellten Funktionen der Reihe nach von links nach rechts verarbeiten zu lassen. * @param {(arg: any) => any} Funktionen * @returns {(arg: any) => any} */ Funktion Pipe(...Funktionen) { return (arg) => { Rückgabefunktion.Reduce( (acc, Funktion) => Funktion(acc), arg ) } } 2. Rückgabefunktionen akzeptieren unbestimmte ParameterDer Funktionsschritt zum Herausfiltern von Nicht-Funktionen wird ebenfalls ausgelassen. /** * Gibt eine Funktion zurück, um den Eingabewert von den bereitgestellten Funktionen der Reihe nach von links nach rechts verarbeiten zu lassen. * @param {Array<(...args: any) => any>} Funktionen * @returns {(...args: any[]) => any} */ Funktion Pipe(...Funktionen) { // const realFuncs = funcs.filter(isFunction); return (...args) => { Rückgabefunktion.Reduce( (acc, func, idx) => idx === 0 ? func(...acc) : func(acc), Argumente ) } } Bessere Schreibleistung, Vermeidung unnötiger Vergleiche und CPU-Verschwendung Funktion Pipe(...Funktionen) { return (...args) => { // Der erste wurde verarbeitet, nur die restlichen müssen verarbeitet werden return funcs.slice(1).reduce( (acc, Funktion) => Funktion(acc), // Behandeln Sie zuerst den Sonderfall als „acc“ Funktionen[0](...Argumente) ) } } Achten Sie auf die Fallstricke der zweiten Schreibweise Implementierung von lodash.get Durch die Implementierung von const obj = { a: { b: { c: 'Hallo Welt' } } }; erhalte(Objekt, 'abc'); Funktionssignatur: /** * Den Wert über den Schlüsselpfad abfragen * @param beliebiges Objekt * @param keyPath Zeichenfolge durch Punkte getrennter Schlüsselpfad* @returns {any} Zielwert*/ Funktion get(Objekt, Schlüsselpfad) {} Referenzantwort/** * Wählen Sie den Wert über den Schlüsselpfad aus. * @param beliebiges Objekt * @param keyPath Zeichenfolge durch Punkte getrennter Schlüsselpfad* @returns {any} Zielwert*/ Funktion get(Objekt, Schlüsselpfad) { wenn (!obj) { Rückgabe undefiniert; } returniere keyPath.split('.').reduce((acc, key) => acc[key], obj); } Implementierung von lodash.flattenDeepObwohl Concat- und Spread-Operatoren nur eine Ebene abflachen können, kann durch Rekursion eine tiefe Abflachung erreicht werden. Methode 1: Spread-Operator Funktion flatDeep(arr) { Rückgabewert arr.reduce((acc, item) => Array.isArray(Element) ? [...acc, ...flatDeep(Element)] : [...acc, Element], [] ) } Methode 2: concat Funktion flatDeep(arr) { Rückgabewert arr.reduce((acc, item) => acc.concat(Array.isArray(Element) ? flatDeep(Element) : Element), [] ) } Interessanter Leistungsvergleich: Der Expansionsoperator benötigt 1098 ms, um 70.000 Mal ausgeführt zu werden, während concat in der gleichen Zeit nur 20.000 Mal ausgeführt werden kann. Funktion flatDeep(arr) { Rückgabewert arr.reduce((acc, item) => Array.isArray(Element) ? [...acc, ...flatDeep(Element)] : [...acc, Element], [] ) } var arr = Wiederholung([1, [2], [[3]], [[[4]]]], 20); Konsole.log(arr); Konsole.log(flatDeep(arr)); Konsole.Zeit('concat') für (i = 0; i < 7 * 10000; ++i) { flatDeep(arr) } Konsole.timeEnd('concat') Funktion „Wiederholung (arr, mal)“ { „let Ergebnis = []; für (i = 0; i < mal; ++i) { „ergebnis.push(...arr)“} „return Ergebnis“;} Nullwerte in einem Objekt herausfilternerreichen sauber({ foo: null, bar: undefiniert, baz: 'hallo' }) // { baz: 'hallo' } Antwort /** * Filtern Sie die „Nil“-Werte (null oder undefiniert) heraus. * @param {Objekt} Objekt * @returns {any} * * @example clean({ foo: null, bar: undefiniert, baz: 'hallo' }) * * // => { baz: 'hallo' } */ Exportfunktion clean(obj) { wenn (!obj) { gibt Objekt zurück; } returniere Objekt.Schlüssel(Objekt).Reduce((acc, Schlüssel) => { wenn (!isNil(obj[Schlüssel])) { acc[Schlüssel] = obj[Schlüssel]; } Rückgabe gem. }, {}); } aufzählenSimulieren Sie konstante Objekte als TS-Aufzählungen Implementieren Sie const Richtung = { Oben: 0, NACH UNTEN: 1, LINKS: 2, RECHTS: 3, }; const actual = aufzählen(Richtung); Konstante erwartet = { Oben: 0, NACH UNTEN: 1, LINKS: 2, RECHTS: 3, 0: 'AUF', 1: 'UNTEN', 2: 'LINKS', 3: 'RECHTS', }; deepStrictEqual(tatsächlich, erwartet); Antwort: /** * Enumeration aus Objekt generieren. * @siehe https://www.typescriptlang.org/play?#code/KYOwrgtgBAglDeAoKUBOwAmUC8UCMANMmpgEw5SlEC+UiiAxgPYgDOTANsAHQdMDmAChjd0GAJQBuRi3ZdeA4QG08AXSmIgA * @param {Objekt} Objekt * @returns {Objekt} */ Exportfunktion enumify(obj) { wenn (!isPlainObject(obj)) { throw new TypeError('das Enumify-Ziel muss ein einfaches Objekt sein'); } returniere Objekt.Schlüssel(Objekt).Reduce((acc, Schlüssel) => { acc[Schlüssel] = obj[Schlüssel]; acc[Objekt[Schlüssel]] = Schlüssel; Rückgabe gem. }, {}); } Serienvollstrecker für VersprechenDurch die Verwendung von „Reduce“ können wir eine unbegrenzte Anzahl von Promises seriell ausführen, was in tatsächlichen Projekten eine große Rolle spielen kann. Ich werde hier nicht ins Detail gehen. Bitte lesen Sie meinen nächsten Artikel „JS Request Scheduler“. expandierenBitte verwenden Sie Jest als Testframework und schreiben Sie Unit-Tests für alle Methoden in diesem Artikel. Weitere Übungen finden Sie unter github.com/you-dont-ne… Oben finden Sie den detaillierten Inhalt der ausführlichen Erläuterung zur Verwendung von JavaScript Reduce. Weitere Informationen zur Verwendung von JavaScript Reduce finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: CentOS7 64-Bit-Installation MySQL Grafik-Tutorial
>>: Packetdrills prägnantes Benutzerhandbuch
MySQL-Berechtigungen und Indizes Der höchste Benu...
Inhaltsverzeichnis Vorwort MySQL Master-Slave-Rep...
Ein gemeinsamer Index wird auch als zusammengeset...
Inhaltsverzeichnis Implementierung der Statusfrei...
Beim UI-Schnittprozess besteht die Seite häufig a...
Die eigene Quelle von Ubuntu stammt aus China, da...
In diesem Artikel wird der spezifische Code des V...
Vorwort: position:sticky ist ein neues Attribut d...
HTML-Wiederverwendung ist ein Begriff, der selten ...
Dig-Einführung: Dig ist ein Tool, das DNS einschl...
Die Speichergröße und der Bereich jedes Gleitkomm...
Inhaltsverzeichnis 1. Installieren Sie VMware 1.1...
Virtuelle Linux-Maschine: VMware + Ubuntu 16.04.4...
Ab IE 8 wurde ein Kompatibilitätsmodus hinzugefügt...
Installationsmethode für komprimierte MySQL 8.0-P...