javascript 在重写受下划线库启发的调用函数时遇到问题

gojuced7  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(199)

我是一个初学者,试图重写下划线函数_.invoke。我试图使函数返回一个数组,其中包含对集合中的每个值调用该方法的结果。

_.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
}

我觉得我的问题出在这一行:
methodName.call(collection[i])-想调用对象collection[i]上的方法,但我想传递一些参数,它们应该包含在单元测试中。
到目前为止,我一直在使用这个测试:typeof(methodName) === "function"并编写一个函数来测试该方法是否是函数。

ffdz8vbo

ffdz8vbo1#

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

_.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;
6fe3ivhb

6fe3ivhb2#

你是说像这样的东西吗

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)

相关问题