gpt4 book ai didi

javascript - 在接受数字或数组作为参数的函数内部,如何有效地操作这些参数而不考虑类型?

转载 作者:行者123 更新时间:2023-11-29 20:30:51 24 4
gpt4 key购买 nike

假设您有一个接受一维坐标、二维坐标或三维坐标作为参数的函数。在函数调用时,如果用户想要传递一些一维坐标,他们会传递简单的数字,例如:

myFunction(30, 50);

但是如果他们想传递 2D 或 3D 坐标,他们会将这些坐标作为数组/向量值传递,例如:

myFunction([30, 40], [50, 60]);

现在,在函数定义中,假设您要运行涉及传递的坐标的各种操作和方程式。因为您需要处理两种不同的 arg 类型(数字与数组)中的一种,您可能希望为每种数据类型设置不同的语句格式,因此您最终可能会重复一堆语句,这是低效的。为了争论,假设您不能对数组 args 进行简单的向量数学运算,而是需要循环并按索引将它们分解:

function myFunction( coord1, coord2 ) {
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] = coord1[i] * coord2[i];
myVar2[i] = myVar1[i] / coord2[i] + myVar1[i];
myVar3[i] = coord1[i] * (coord2[i] / myVar2[i]);
}

// else if args are scalar
} else {
myVar1 = coord1 * coord2; // this
myVar2 = myVar1 / coord2 + myVar1; // is
myVar3 = coord1 * (coord2 / myVar2); // inefficient
}

return myVar3;
}

上面的等式是无稽之谈,但它们只是为了说明。 如何避免在这里重复自己?我可以想到几种 DRY 方法(将标量参数分配给单索引数组;或将方程组变成困惑且难以阅读的“逻辑”或”表达式(例如,myVar[i] = (coord1[i] || coord1) * (coord2[i] || coord2));或装配一组对象或其他东西),但是我真的不喜欢他们中的任何一个,而且我还是一个新手,所以我不知道那是什么我不知道。任何有经验的编码人员都想权衡处理这种情况的最佳做法吗?

最佳答案

对于逐元素重复,只需让数组函数调用标量函数即可:

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)

关于javascript - 在接受数字或数组作为参数的函数内部,如何有效地操作这些参数而不考虑类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58357585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com