Eine einfache rekursive Funktion funktioniert der Trick
// arr - some array of values
// f - the reducing function
// acc - initial value for the accumulator
function reduce(arr, f, acc) {
if (arr.length === 0)
return acc
else
return reduce(arr.slice(1), f, f(acc, arr[0]))
}
// --------------------------------------------------
// example 1:
// reduce an array of numbers using an adding function
var ex1 = reduce([1,2,3], function(acc, x) { return acc + x }, 0)
console.log(ex1)
//=> 6
// --------------------------------------------------
// example 2:
// reduce an array of pairs to a mapping object
var ex2 = reduce([['a', 1], ['b', 2], ['c', 3]], function(acc, pair) {
var key = pair[0]
var value = pair[1]
acc[key] = value
return acc
}, {})
console.log(ex2)
//=> { a: 1, b: 2, c: 3 }
Wie @torazaburo in einem Kommentar weist darauf hin, wenn Sie können Verwenden Sie ES6, Destrukturierungsaufgabe räumt die Implementierung noch mehr auf
// ES6
function reduce([x, ...xs], f, acc) {
if (x === undefined)
return acc
else
return reduce(xs, f, f(acc, x))
}
Oder es wird Super zuckersüß mit Pfeil Funktionen
// ES6, same as above but using arrow function and ternary expression
const reduce = ([x, ...xs], f, acc)=>
x === undefined ? acc : reduce(xs, f, f(acc, x))
Die Unders Implementierung einige andere Annehmlichkeiten tut bieten, obwohl ich vermute, das sind hier die Kompatibilität mit nativem Array.prototype.reduce zu halten. Ich persönlich würde das nicht auf diese Weise reduzieren, aber das ist nebensächlich.
- Underscore übergibt einen Iterator und eine Arr-Referenz an die Callback-Funktion.
- Unders ermöglicht es Ihnen, den Kontext für die Callback-Funktion ist zu ändern
Hier eine überarbeitete Implementierung, die
// our reduce version 2.0
function reduce(collection, iterator, memo, context) {
function loop(memo, i) {
if (collection.length === i)
return memo
else
return loop(iterator.call(context, memo, collection[i], i, collection), i + 1)
}
return loop(memo, 0)
}
diese Funktionen unterstützt, können Sie es gleich verwenden, wie erst jetzt darüber mehr Informationen liefert an die Callback
HINWEIS
habe beschlossen, ich gezielt nicht, um ein Verhalten von Underscore reduzieren zu implementieren, das es Ihnen ermöglicht, eine Reduzierung ohne einen Anfangswert durchzuführen. Die Unterstützung dieses Verhaltens führt zu unsicheren Code und sollte eigentlich nie zu Underscore geführt haben.
Nun, das ist nicht vollständiger Code und hat einige Probleme. Wie sieht deine "Reduce" -Funktion aus? –
Sie überschreiben 'Iterator' - warum? Woher kommt 'startPoint'? Was bedeutet die Variable "Combiner" und warum haben Sie sie so benannt? –