suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Lassen Sie sich von der Unterstrichbibliothek inspirieren und arbeiten Sie hart daran, die aufrufende Funktion neu zu schreiben

Ich bin ein Anfänger und versuche, die Unterstreichungsfunktion neu zu schreiben_.invoke. Ich versuche, die Funktion so zu erstellen, dass sie ein Array zurückgibt, das die Ergebnisse des Methodenaufrufs für jeden Wert in der Sammlung enthält.

_.invoke = function(collection, methodName) {
  var result = [];
  if (Array.isArray(collection)) {
    for (let i = 0; i < collection.length; i++) {
      methodName.call(collection[i])
      var value = collection[i][methodName]
      result.push(value)
    }
  }
  return result
}

Ich glaube, mein Problem liegt in dieser Zeile:

Methode auf

methodName.call(collection[i]) - 想调用对象 collection[i], aber ich möchte einige Parameter übergeben, wenn sie im Unit-Test enthalten sind.

Bisher habe ich versucht, test: typeof(methodName) === "function" zu verwenden und eine Funktion zu schreiben, um zu testen, ob die Methode eine Funktion ist.

P粉990008428P粉990008428239 Tage vor440

Antworte allen(2)Ich werde antworten

  • P粉165522886

    P粉1655228862024-04-01 09:15:45

    在这里您可以使用参数进行调用。

    _.invoke = function(collection, methodName, ...args) {
      if (!Array.isArray(collection)) {
         return [];
      }
      const out = []; 
      for(const item of collection){
        if(typeof item[methodName] === 'function')
          out.push(item[methodName].apply(item, args));
        }
      }
      return out;
    }

    要测试所有项目都有一个方法:

    const collection = [...];
    const allHaveMethod = _.invoke(collection, 'method', 'arg1', 'arg2').length === collection.length;

    Antwort
    0
  • P粉413704245

    P粉4137042452024-04-01 00:23:43

    你的意思是这样的吗?

    const myArr = [
      { cons:function(args) { return args } },
      { cons:function(args) { return args["bla"] } },
    ]
    
    const _ = {};
    _.invoke = (collection, methodName, ...args) => !Array.isArray(collection) ? [] : collection
    .filter(item => typeof item[methodName] === 'function')
    .map(item => item[methodName].apply(item, args));
    
    const res = _.invoke(myArr,"cons",{"bla":"hello"})
    console.log(res)

    Antwort
    0
  • StornierenAntwort