Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中循环使用具有不同签名的函数数组的最佳实践?_Javascript_Arrays_Function - Fatal编程技术网

在Javascript中循环使用具有不同签名的函数数组的最佳实践?

在Javascript中循环使用具有不同签名的函数数组的最佳实践?,javascript,arrays,function,Javascript,Arrays,Function,我有一个javascript函数数组Functs=[f1,f2,f3…],我想在数组上循环,按顺序执行每个函数 Edit:目前,我们确实有在循环中显式调用的函数,而(true){f1(a,b,c);f2(b);f3(c)…}。但是,我们希望使此管道可扩展,以便用户可以在任何阶段向管道中插入自定义函数,方法是提供一个公共方法,用于将项插入数组中,从而:while(true){f1(a,b,c);f2(b);fCustom(b,c);f3(c)…}。因此,外部可编辑的管道。也许有更好的方法可以做到这

我有一个javascript函数数组
Functs=[f1,f2,f3…]
,我想在数组上循环,按顺序执行每个函数

Edit:目前,我们确实有在循环
中显式调用的函数,而(true){f1(a,b,c);f2(b);f3(c)…}
。但是,我们希望使此管道可扩展,以便用户可以在任何阶段向管道中插入自定义函数,方法是提供一个公共方法,用于将项插入数组中,从而:
while(true){f1(a,b,c);f2(b);fCustom(b,c);f3(c)…}
。因此,外部可编辑的管道。也许有更好的方法可以做到这一点,但是一个可编辑的函数数组似乎是最简单的方法

问题是,每个函数都有不同的签名,需要不同的输入,例如:

f1 = function(name, address, date) {};
f2 = function(name, age) {};
f3 = function(height);
这些函数将循环如下:

mainFunction() {

  let name = something;
  let address = something;
  let date = something;
  ....
  let height = something;

  while(condition == true) {
    for(f in Functs) {
      f(?????); //Each f() has a different signature?
    } 
  }
}
如何确保可以将所需参数传递给每个函数?我在想类似这样的事情,用一个parameters对象将函数包装在里面,但不知道这会有多干净。至少函数可以保留其唯一的签名,但这似乎仍然是一个难题

编辑:给定值列表(名称、年龄、日期等),每个函数都在顺序管道中处理此数据块。可能有一个函数会检查
年龄
值,如果它满足某个条件,则修改
日期
。下一个函数将查看
name
date
函数,并以某种方式对它们进行操作,然后用结果覆盖
name
。直到管道中的一个阶段(可能在几个循环之后)检测到所有内容都已完全处理。因此,每个阶段都需要能够改变这些参数,以便序列中的下一个函数可以看到这些变化,即:
f2=function(height){height+=2;}
f3=function(name,age,height){if(height>age)condition=false;}

mainFunction() {
  let params = {
    name : something,
    address : something,
    date : something,
    ...
    height : something
  };

  f1 = function(params) {
    f1Inner = function (params.name, params.address, params.date) {};
  }

  Functs = [f1, f2, f3...]

  while(condition == true) {
    for(f in Functs) {
      f(params);
    } 
  }
}

我会将函数更改为接受单个参数作为对象,该对象会被解构,因此可以使用相同的参数调用所有函数:

mainFunction() {
  let name = something;
  let address = something;
  let date = something;
  ....
  let height = something;
  const paramsObj = { name, address, date, height };
  for (const fn of Functs) {
    fn(paramsObj);
    // do whatever you need to do with the return value or loop logic
  }

如果需要在传递这些参数的同时对其进行修改,则可以在第一行中对其进行分解,从而允许您修改params对象,例如:

f1 = function(params) {
  const { name, address, date } = params;
  if (someCondition) {
    params.height += 2;
  }
};

随后的调用将看到已更改的参数。

我会将函数更改为接受单个参数作为对象,该对象将被分解,以便可以使用相同的参数调用所有函数:

mainFunction() {
  let name = something;
  let address = something;
  let date = something;
  ....
  let height = something;
  const paramsObj = { name, address, date, height };
  for (const fn of Functs) {
    fn(paramsObj);
    // do whatever you need to do with the return value or loop logic
  }

如果需要在传递这些参数的同时对其进行修改,则可以在第一行中对其进行分解,从而允许您修改params对象,例如:

f1 = function(params) {
  const { name, address, date } = params;
  if (someCondition) {
    params.height += 2;
  }
};
然后后续调用将看到更改的参数。

const if_then=(if_fn,then_fn)=>(params_object)=>
如果是fn(参数对象)?然后_fn(params_object):null;
const apply_params=(fn,arg_key,write_to_key=false)=>(params_object)=>{
const result=fn(…参数keys.map((v)=>参数对象[v]);
if(将\写入\键)
params_对象[将_写入_键]=结果;
返回结果;
};
const name_和_age=(name,age)=>name+‘是’+age+‘一岁半’;
常量体积=(高度、宽度、深度)=>高度*宽度*深度;
常数双_高度=(高度)=>高度*2;
常数双_宽度=(宽度)=>宽度*2;
const count_loop=(params_object)=>object.assign(params_object,{loop_count:(params_object.loop_count??0)+1})
设函数=[
计数循环,
应用_参数(双_高度,['height'],'height'),
如果你那么(
(p) =>!p.姓名和年龄,
应用参数(名称和年龄,['名称','年龄'],'名称和年龄'),
),
];
const bob=true;
如果(鲍勃)
功能推送(
如果你那么(
(p) =>p.loop_计数>2,
应用_参数(双_宽度,['width'],'width'),
)
);
functs=functs.concat([
应用_参数(体积、[“高度”、“宽度”、“深度”]、“体积”),
console.log
]);
设params={
名字:“奥伯德的冷酷”,
年龄:145,
身高:2,
宽度:0.3,
深度:0.2,
};
常量应退出循环=(参数对象)=>
(params|u object.loop|u count | 0)>10 | | params|u object.height>8;
而(!应该退出循环(参数)){
forEach函数(
(f) =>f(参数)
);
};
const if_then=(if_fn,then_fn)=>(params_object)=>
如果是fn(参数对象)?然后_fn(params_object):null;
const apply_params=(fn,arg_key,write_to_key=false)=>(params_object)=>{
const result=fn(…参数keys.map((v)=>参数对象[v]);
if(将\写入\键)
params_对象[将_写入_键]=结果;
返回结果;
};
const name_和_age=(name,age)=>name+‘是’+age+‘一岁半’;
常量体积=(高度、宽度、深度)=>高度*宽度*深度;
常数双_高度=(高度)=>高度*2;
常数双_宽度=(宽度)=>宽度*2;
const count_loop=(params_object)=>object.assign(params_object,{loop_count:(params_object.loop_count??0)+1})
设函数=[
计数循环,
应用_参数(双_高度,['height'],'height'),
如果你那么(
(p) =>!p.姓名和年龄,
应用参数(名称和年龄,['名称','年龄'],'名称和年龄'),
),
];
const bob=true;
如果(鲍勃)
功能推送(
如果你那么(
(p) =>p.loop_计数>2,
应用_参数(双_宽度,['width'],'width'),
)
);
functs=functs.concat([
应用_参数(体积、[“高度”、“宽度”、“深度”]、“体积”),
console.log
]);
设params={
名字:“奥伯德的冷酷”,
年龄:145,
身高:2,
宽度:0.3,
深度:0.2,
};
常量应退出循环=(参数对象)=>
(params|u object.loop|u count | 0)>10 | | params|u object.height>8;
而(!应该退出循环(参数)){
forEach函数(
(f) =>f(参数)
);

};经过大量测试和基准测试,我们想出的最快方法是(使用@certainPerformance的解决方案作为起点):

  • 将函数存储在