在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ JS怎樣精簡(jiǎn)這樣的循環(huán)

JS怎樣精簡(jiǎn)這樣的循環(huán)

JavaScript
如下代碼,循環(huán)里除了判斷的條件不一樣,其它都是一樣的。判斷的條件里有可能會(huì)包含i,也有可能不含i。有沒(méi)有辦法精簡(jiǎn)它們??

// obj 這是一個(gè)json
loop1(){
    for(let i=0;i<obj.length;i++){
        if(i%2!==0){
            doSomethingA()
        } else {
            doSomethingB()
        }
    }
}
loop2(){
    for(let i=0;i<obj.length;i++){
        if(i%2!==0 && i!==0){
            doSomethingA()
        } else {
            doSomethingB()
        }
    }
}
loop3()。。。
loop4()。。。
回答
編輯回答
拼未來(lái)

let loop = (fun) => {
obj.forEach((v, k) => {

if (fun) {
} else {
}

})
}
loop(fun)

2017年3月17日 09:23
編輯回答
何蘇葉

// 舉個(gè)例子
let isKeyExist = (obj, key) => !!obj[key]

let predicateFactory = (condition, i) => {
    // 意會(huì)
    if (condition) {
        return i % 2 === 0
    } else {
        return i % 2 === 0 && i !== 0
    }
}

loop() {
    for (let i = 0; i < obj.length; i++) {
        if (predicateFactory(isKeyExist(obj, 'foo'), i)) {
            doSomethingA()
        } else {
            doSomethingB()
        }
    }
}

至于那個(gè) condition 是什么,就看你區(qū)分這些 loop 的依據(jù)是什么,想辦法抽象一下看看。

這樣可以把 什么情況使用什么判斷方式 抽象出來(lái),而不需要針對(duì)各種情況單獨(dú)寫(xiě)一次 loop(...)。
condition 想做成啥樣都是看你想怎么抽象 情況判斷方式 來(lái)搞。

當(dāng)然如果不需要這么高層次抽象,那就可以多寫(xiě)幾個(gè) loop 來(lái)看情況調(diào)用,本質(zhì)上跟上面抽象 condition 是一樣的,只是代碼調(diào)用上的區(qū)別。


比如來(lái)個(gè)稍微復(fù)雜點(diǎn)的:


const CONDITIONS = {
    OBJ_HAS_SOME_KEY: i => i % 2 === 0,
    OBJ_MISS_SOME_KEY: i => i % 2 === 0 && i !== 0
}

// 舉個(gè)例子
let conditionMatch = obj => {
    let predicate = undefined
    
    if (obj[someKey]) {
        predicate = CONDITIONS.OBJ_HAS_SOME_KEY
    } else {
        predicate = CONDITIONS.OBJ_MISS_SOME_KEY
    }
    
    if (predicate === undefined) {
        throw new Error('無(wú)法找到任何能匹配的處理函數(shù)')
    }
    
    return predicate
}

loop() {
    for (let i = 0; i < obj.length; i++) {
        if (conditionMatch(obj)(i)) {
            doSomethingA()
        } else {
            doSomethingB()
        }
    }
}

如果還要能在 predicate 里使用 obj 啦、使用更多參數(shù)啦,那就不能讓 predicate 是箭頭函數(shù)了,使用 function 然后 return function() {return predicate.apply(obj, arguments)}

2017年2月23日 11:07
編輯回答
情未了
// obj = xxxx

function loop (predicate) {
    for (let i = 0; i < obj.length; i++) {
        if (predicate(i)) {
            doSomethingA()
        } else {
            doSomethingB()
        }
    }
}

loop(i => i % 2 !== 0)
loop(i => i % 2 !== 0 && i !== 0)
2018年7月15日 07:16
編輯回答
嘟尛嘴
function loop (obj, fun) {
  for (let i = 0; i < obj.length; i++) {
    if (fun(i, obj)) {
      doSomethingA()
    } else {
      doSomethingB()
    }
  }
}

loop1 等價(jià)于 loop(obj, function(i) {return i % 2 !== 0})
loop2 等價(jià)于 loop(obj, function(i) {return i % 2 !== 0 && i !== 0})
2018年2月26日 07:44