亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在接受數字或數組作為 args 的函數中,如何有效地操作這些 args 而不管類型如何?

在接受數字或數組作為 args 的函數中,如何有效地操作這些 args 而不管類型如何?

開滿天機 2021-11-18 17:15:23
假設您有一個函數,它接受 1D 坐標、2D 坐標或 3D 坐標作為參數。在函數調用時,如果用戶想傳遞一些一維坐標,他們會傳遞簡單的數字,例如: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 方法(將標量 args 分配給單索引數組;或者將大塊的方程變成混亂且難以閱讀的“邏輯或”表達式(例如,myVar[i] = (coord1[i] || coord1) * (coord2[i] || coord2));或者裝配一個對象數組或者什么),但我真的不喜歡其中任何一個,而且我還是個新手,所以我不知道它是什么我不知道。任何有經驗的編碼人員都想權衡處理這種情況的最佳實踐嗎?
查看完整描述

3 回答

?
慕神8447489

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)


查看完整回答
反對 回復 2021-11-18
?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

如果您的泛型函數應該始終具有同構參數和返回類型,那么首先僅使用原語為您的函數定義基本情況,然后使用包裝函數遍歷您的參數并將您的基本情況函數應用于每個元素:


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]]));


查看完整回答
反對 回復 2021-11-18
?
弒天下

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;

}


查看完整回答
反對 回復 2021-11-18
  • 3 回答
  • 0 關注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號