第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

開滿天機 2021-11-18 17:15:23
假設(shè)您有一個函數(shù),它接受 1D 坐標(biāo)、2D 坐標(biāo)或 3D 坐標(biāo)作為參數(shù)。在函數(shù)調(diào)用時,如果用戶想傳遞一些一維坐標(biāo),他們會傳遞簡單的數(shù)字,例如:myFunction(30, 50);但是如果他們想傳遞 2D 或 3D 坐標(biāo),他們會將這些坐標(biāo)作為數(shù)組/向量值傳遞,例如:myFunction([30, 40], [50, 60]);現(xiàn)在,在函數(shù)定義中,假設(shè)您要運行涉及傳遞的坐標(biāo)的各種操作和方程。因為您需要處理兩種不同的 arg 類型(數(shù)字與數(shù)組)中的一種,所以您可能希望針對每種數(shù)據(jù)類型對語句進行不同的格式化,因此最終可能會重復(fù)一堆語句,這是低效的。為了論證起見,假設(shè)您不能對數(shù)組 args 進行簡單的向量數(shù)學(xué)運算,而是需要循環(huán)并按索引將它們分解: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;}上面的等式是無稽之談,但它們只是為了說明。您將如何避免在這里重復(fù)自己?我可以想到幾種 DRY 方法(將標(biāo)量 args 分配給單索引數(shù)組;或者將大塊的方程變成混亂且難以閱讀的“邏輯或”表達式(例如,myVar[i] = (coord1[i] || coord1) * (coord2[i] || coord2));或者裝配一個對象數(shù)組或者什么),但我真的不喜歡其中任何一個,而且我還是個新手,所以我不知道它是什么我不知道。任何有經(jīng)驗的編碼人員都想權(quán)衡處理這種情況的最佳實踐嗎?
查看完整描述

3 回答

?
慕神8447489

TA貢獻1780條經(jīng)驗 獲得超1個贊

對于逐元素重復(fù),只需讓數(shù)組函數(shù)調(diào)用標(biāo)量函數(shù):


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

}

當(dāng)然你也可以把它變成一個重載函數(shù),比如


function myFunction(coord1, coord2) {

    if (Array.isArray(coord1)) { // args are arrays

        return myFunctionArr(coord1, coord2);

    } else { // args are scalar

        return myFunctionScalar(coord1, coord2);

    }

}

您甚至可以在輔助函數(shù)(也由許多具有功能的庫提供)中的多個數(shù)組元素上抽象函數(shù)的元素應(yīng)用:


return zipWith(myFunctionScalar, coords1, coords2)


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

TA貢獻1794條經(jīng)驗 獲得超7個贊

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


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


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

TA貢獻1818條經(jīng)驗 獲得超8個贊

定義每個方程的函數(shù)。


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;

}


查看完整回答
反對 回復(fù) 2021-11-18
  • 3 回答
  • 0 關(guān)注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號