Javascript 当使用集合时,调用接收单个对象作为参数的函数的最佳方法是什么?
有时,您有一个函数可以用于平面参数。例如:Javascript 当使用集合时,调用接收单个对象作为参数的函数的最佳方法是什么?,javascript,Javascript,有时,您有一个函数可以用于平面参数。例如: send(player,message) 但是,如果你有玩家/消息的集合呢 message = ['Welcome!','Check our site for events.'] players = [Player1,Player2,Player3] 为循环编写将降低可读性,如果您不静态地知道参数是集合还是对象,则编写循环将不起作用。重写函数有时是不可行的,或者太费力,并且会导致代码重复。什么是更简单的解决方案?您可以编写一个函数,将您的函数转换为
send(player,message)
但是,如果你有玩家/消息的集合呢
message = ['Welcome!','Check our site for events.']
players = [Player1,Player2,Player3]
为循环编写将降低可读性,如果您不静态地知道参数是集合还是对象,则编写循环将不起作用。重写函数有时是不可行的,或者太费力,并且会导致代码重复。什么是更简单的解决方案?您可以编写一个函数,将您的函数转换为一个函数,该函数将采用它自己的参数,并对其调用原始函数
function send(player,message) {
console.log('To ',player,': ',message);
}
cartesian(send)(['Player1','Player2','Player3'],['Welcome!','Check our site.']);
//Output:
//To Player1 : Welcome!
//To Player1 : Check our site.
//To Player2 : Welcome!
//To Player2 : Check our site.
//To Player3 : Welcome!
//To Player3 : Check our site.
这将在Javascript上实现装饰器(“笛卡尔”):
function cartesian_product(arr){
//cartesian_product( [[1,2],[3,4]] ) = [[1,3],[1,3],[2,3],[2,4]]
function partial_product(arr,i){
//partial_product([[1,2],3],0) = [[1,3],[2,3]]
var result = []
for (j=0; j<arr[i].length; ++j){
arr_changed = arr.slice();
arr_changed.splice(i,1,arr[i][j]);
result.push(arr_changed);
};
return result;
};
var result = [arr.slice()];
for (var x=0; x<arr.length; ++x){
for (var y=0; y<result.length; ++y){
if (result[y][x] instanceof Array) {
result.splice.apply(result,[y,1].concat(partial_product(result[y],x)));
}
}
}
return result;
};
function cartesian(func){
//cartesian(func)([1,2],[3,4]) = [func([1,3]),func([1,4]),func([2,3]),func([2,4])]
_this = this;
return function(){
var args_list = cartesian_product(Array.prototype.slice.call(arguments));
var return_values = []
for (var i=0; i<args_list.length; ++i){
return_values.push(func.apply(_this,args_list[i]))
}
return return_values;
}
}
函数笛卡尔积(arr){
//笛卡尔积([[1,2],[3,4]])=[[1,3],[1,3],[2,3],[2,4]]
函数部分积(arr,i){
//部分积([[1,2],3],0)=[[1,3],[2,3]]
var结果=[]
对于(j=0;j