3 回答
TA贡献1780条经验 获得超1个赞
对于逐元素重复,只需让数组函数调用标量函数:
function myFunctionArr(coords1, coords2) {
const results = [];
for (let i = 0; i < coords1.length; i++) {
results[i] = myFunctionScalar(coords1[i], coords2[i]);
}
return results;
}
function myFunctionScalar(coord1, coord2) {
const myVar1 = coord1 * coord2;
const myVar2 = myVar1 / coord2 + myVar1;
return coord1 * (coord2 / myVar2);
}
当然你也可以把它变成一个重载函数,比如
function myFunction(coord1, coord2) {
if (Array.isArray(coord1)) { // args are arrays
return myFunctionArr(coord1, coord2);
} else { // args are scalar
return myFunctionScalar(coord1, coord2);
}
}
您甚至可以在辅助函数(也由许多具有功能的库提供)中的多个数组元素上抽象函数的元素应用:
return zipWith(myFunctionScalar, coords1, coords2)
TA贡献1794条经验 获得超7个赞
如果您的泛型函数应该始终具有同构参数和返回类型,那么首先仅使用原语为您的函数定义基本情况,然后使用包装函数遍历您的参数并将您的基本情况函数应用于每个元素:
function myFunction (coord1, coord2) {
const myVar1 = coord1 * coord2;
const myVar2 = myVar1 / coord2 + myVar1;
return coord1 * (coord2 / myVar2);
}
function generic (f) {
return function g (x, ...args) {
return Array.isArray(x)
? x.map((el, i) => g(el, ...args.map(arg => arg[i])))
: f(x, ...args);
};
}
const myGenericFunction = generic(myFunction);
console.log(myGenericFunction(30, 50));
console.log(myGenericFunction([30, 40], [50, 60]));
console.log(myGenericFunction([[30, 40], [70, 80]], [[50, 60], [10, 20]]));
TA贡献1818条经验 获得超8个赞
定义每个方程的函数。
function myFunction( coord1, coord2 ) {
// Equations
let e1 = (a,b) => {return a * b;}
let e2 = (a,b,c) => {return a * b + c;}
let e3 = (a,b,c) => {return a * (b / c);}
let myVar1 = 0, myVar2 = 0, myVar3 = 0;
// if args are arrays
if ( Array.isArray( coord1 ) ) {
myVar1 = [], myVar2 = [], myVar3 = [];
for (let i = 0; i < coord1.length; i++) {
myVar1[i] = e1(coord1[i], coord2[i]);
myVar2[i] = e2(myVar1[i],coord2[i],myVar1[i]);
myVar3[i] = e3(coord1[i],coord2[i],myVar2[i]);
}
// else if args are scalar
} else {
myVar1 = e1(coord1,coord2); // this
myVar2 = e2(myVar1,coord2,myVar1); // is
myVar3 = e3(coord1,coord2,myVar2); // inefficient
}
return myVar3;
}
添加回答
举报