2017-04-13 80 views
3

我想迭代使用forEach,並且當正確的元素被找到時,返回值。我的印象是forEach內的一個簡單的return就足夠了,但得知調用語句的結果是undefined如何從forEach退出擁抱方法?

因此,我不得不聲明一個輸出變量的作用域爲整個方法,並勾選了所有元素,儘管已經找到了正確的那個。 (元素是唯一的。)

getMenuIndex(url) { 
    let output = -1; 

    this.menus.forEach(app => { 
    app.subs.forEach(sub => { 
     console.log(sub.link + " vs " + url); 
     if (sub.link === url) 
     // return sub.id; 
     output = sub.id; 
    }); 
    }); 

    return output; 
} 

這是代碼味道很長的路。有沒有更好的方法來選擇匹配URL條件的元素的ID?

+1

[沒有forEach的內置中斷](http://stackoverflow.com/questions/2641347/how-to-short-circuit-array-foreach-like-calling-break) – Hodrobond

+0

而不是'forEach '你可以使用'find'。通過'Array.find'你可以通過返回'true'來停止迭代。 – Titus

+0

@Titus真實但不適用於我的情況。這個東西,如示例中所示是一個嵌套的生物。在實際的程序中,嵌套具有更深的層次。否則,好的建議,隊友。 –

回答

5

幸運的是,我們在打字稿及ES6 for..of這樣的場景:

getMenuIndex(url) { 
    for (const app of this.menus) { 
    for (const sub of app.subs) { 
     console.log(sub.link + " vs " + url); 
     if (sub.link === url) 
     return sub.id; 
    } 
    } 

    return -1; 
} 

它是在forEach的侷限性是顯而易見的情況下非常有用,比如await/yieldreturn/break

正如其他答案所說,有數組方法可能更適合這種情況。雖然對於TypeScript ES5目標for..of轉換爲常規for,因此是本身最快的解決方案。

+0

我更喜歡拉姆達風格的表情,因爲它們讓我看起來更性感。不過,我明白你的觀點,你可能是對的,所以我同意它。 –

+0

我可能也是。有了函數式的方法,它可能會像'const {id = -1} = this.menus.reduce(...)。find(...)|| {};返回id',但它不會有效,即使開發人員進入FP也很難閱讀。 – estus

1

您可以使用Array#some並退出true

function getMenuIndex(url) { 
    let output = -1; 
    this.menus.some(app => app.subs.some(sub => { 
     if (sub.link === url) { 
      output = sub.id; 
      return true; 
     } 
    })); 
    return output; 
} 
+0

然而,您正在以某種方式使用'some' **,而不是與您自己引用的描述在語義上兼容。有些人,我同情他們,認爲這相當於折磨可愛的小貓咪。 – 2017-04-13 18:30:55

+0

@torazaburo,你的意思是錯誤的引用,或者使用一些不使用檢查結果? –