Heim > Fragen und Antworten > Hauptteil
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 aufmethodName.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粉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;
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)