2017-04-07 3 views
0

Ich versuche die Funktion _.invoke des Unterstrichs zu erstellen. Ich kann nicht herausfinden, warum ich einen TypeError bekomme, kann Eigenschaft 'sort' von undefined nicht lesen. Ich nehme an, dies bezieht sich auf das Array, das an die Funktion übergeben wird, aber ich kann jedes Array in der Sammlung protokollieren, so dass ich nicht weiß, warum undefiniert beim Hochladen.Erstellen eines vereinfachten Unterstrichs _.invoke

function each(collection, iteratee, context) { 
 
    let i 
 
    let boundIteratee = iteratee.bind(context) 
 
    if (Array.isArray(collection)) { 
 
    for (i = 0; i < collection.length; i++) { 
 
     boundIteratee(collection[i], i, context) 
 
    } 
 
    } else { 
 
    for (i in collection) { 
 
     if (collection.hasOwnProperty(i)) { 
 
     boundIteratee(collection[i], i, collection); 
 
     } 
 
    } 
 
    } 
 
    return collection 
 
} 
 

 
function map(collection, iteratee, context) { 
 
    let result = [] 
 
    let formula = function(element, index) { 
 
    result.push(iteratee(element, index, context)) 
 
    } 
 
    each(collection, formula, context) 
 
    return result 
 
} 
 

 
function invoke(collection, methodName) { 
 
    let args = Array.prototype.slice.call(arguments, 2) 
 
    let formula = function(array, index) { 
 
    //console.log(array) --> returns arrays in collection... 
 
    return methodName.apply(array, args) 
 
    } 
 
    return map(collection, formula) 
 
} 
 

 
function sortIt(array) { 
 
    return array.sort() 
 
} 
 

 
console.log(invoke([ 
 
    [3, 1, 2], 
 
    [7, 6, 9] 
 
], sortIt))

+0

Bitte gewöhnen Sie sich an, Anweisungen mit ';' zu beenden. Automatisches Einfügen von Semikolons erfüllt nicht immer das, was Sie erwarten. – Barmar

+0

Das Problem ist, dass Sie nie ein Array in Ihre 'sortIt' Funktion übergeben. Ihre Argumente enthalten nicht die Sammlung, die Sie sortieren möchten. – nainy

Antwort

1

Je nachdem, was Sie versuchen zu erreichen, können Sie entweder ersetzen Ihre sortIt Funktion mit:

function sortIt() { return this.sort(); } // since you apply the arrays as context to the function 

oder

return methodName.apply(array, args); 

mit

ersetzen
return methodName(array); 

Beide sind jedoch nicht ideal.

Schauen Sie auch die apply() Methode nach.

Verwandte Themen