2016-12-30 65 views
5

我想知道是否可以像下面的例子那樣直接訪問條件的值。使用if/else中的條件值

var a = ["pear", "kiwi", "orange", "apple"] 
if(a.indexOf("orange") !== -1){ 
    console.log(this) //as a.indexOf("orange") has been evaluated already above this prints 2 
} 

這也會使三元運營商少bloaty

var a = ["pear", "kiwi", "orange", "apple"] 
var b = ((a.indexOf("orange") !== -1) ? this : '') //"this" equals 2 

感謝

編輯: 清除這個問題了任何未來的訪客。 基本上這個問題是關於檢索在if/else語句中評估的結果值。在

var a = ["pear", "kiwi", "orange", "apple"] 
if(a.indexOf("orange") !== -1){ //is basically if(2 !== -1) 
    console.log(this) //would then be "2" from the already evaluted a.indexOf from above 
} 
+1

需要注意的是什麼你問的是*不*訪問條件的值。條件是「真」或「假」。你想訪問條件中的一個子表達式的值(特別是'indexOf()'返回的)。 – Barmar

+0

@Barmar因此,爲什麼這個問題似乎困惑了每個人。詢問條件的價值是有道理的,理論上這可以起作用 – aw04

+0

這就是爲什麼人們應該閱讀問題中的所有細節,包括代碼中的註釋,以便理解它。人們並不總是很擅長找到合適的單詞。 – Barmar

回答

6

如果目標不是評估兩次,您可以簡單地將它存儲在語句之前。你的字面問題的答案是否定的。

const orangeIndex = a.indexOf("orange") 

if (orangeIndex !== -1) { 
    console.log(orangeIndex) 
} 

相同的概念適用於三元運算符。

正如其他人已經表明的那樣,你也可以聲明一個變量並在if語句本身做實際的賦值,但是IMO會使你的代碼在沒有增加任何值的情況下可讀性降低。

+0

這也是一個很好的例子。 –

+2

接受回答我的字面問題。 – Charles

4

的例子有沒有隱含的設施,但你可以比較值賦值給一個變量:

var a = ["pear", "kiwi", "orange", "apple"], result; 
if (result = (a.indexOf("orange") !== -1)){ 
    console.log(result); 
} 

編輯 —可以應用同樣的技術,如果你只是想部分的評估表達式:

var a = ["pear", "kiwi", "orange", "apple"], result; 
if ((result = a.indexOf("orange")) !== -1){ 
    console.log(result); 
} 

現在.indexOf()返回值保留在result而不是比較結果中。

+1

我認爲你(就像我最初)稍微誤讀了這個問題 – aw04

+0

不錯的答案,Pointy –

+0

謝謝你處理變量賦值的這種漂亮的方法 – Charles

0

我重構你的代碼。您可以將條件結果保存在變量中。

var a = ["pear", "kiwi", "orange", "apple"]; 

var isOrange = a.indexOf("orange") !== -1; 

if(isOrange){ 
    console.log(this) //as a.indexOf("orange") has been evaluated already above this prints 2 
} 

var a = ["pear", "kiwi", "orange", "apple"] 
var b = isOrange ? this : '') //"this" equals 2 
+0

你的代碼是如何創建'this == 2'的? – Barmar

0

是的,這其實很簡單。實施例

if (yourvariable = yourcondition) { 
    //Do something 
} else if (yourvariable2 = yourcondition2) { 
    //Do something else 
} else if ((yourvariable3 = yourcondition3) || true) { //This is an else, but you memorized a condition inside it 
    //Do something 
} 

當分配一個值到一個變量,則變量將保持該值,並且還,操作的結果將是的值,因此

if (foo = bar) { 
    //Some operations 
} 

相當於邏輯上

if (bar) { 
    foo = bar; 
    //Some operations 
} 

,但較長,如果bar恰好是一個function有很多的操作,那麼它是不理想的兩次評估。

0

這是接近,因爲它得到

var a = ["pear", "kiwi", "orange", "apple"], result; 
if ((result = a.indexOf("orange")) !== -1) { 
    console.log(result); 
} 

這裏,@result =指數,而不是尖尖提供的邏輯運算的結果。

2

如果您想要真正簡潔的代碼,您可以在條件中指定一個變量。

var orangeIndex; 
 
var a = ["pear", "kiwi", "orange", "apple"]; 
 
if ((orangeIndex = a.indexOf("orange")) !== -1) { 
 
    console.log(orangeIndex); 
 
}

你也可以做一個三元:

var orangeIndex; 
 
var a = ["pear", "kiwi", "orange", "apple"] 
 
var b = (((orangeIndex = a.indexOf("orange")) !== -1) ? orangeIndex : ''); 
 
console.log(b);

在這兩種情況下,不要忘記分配周圍的括號。這是必需的,因爲賦值的優先級比比較運算符要低,所以它會將變量設置爲truefalse

0

您可以通過記憶來完成此操作。 lodash提供了一種方法來執行此操作,稱爲memoize

創建一個函數來記憶func的結果。如果提供瞭解析器,它將根據提供給memoized函數的參數確定用於存儲結果的緩存鍵。默認情況下,提供給memoized函數的第一個參數用作映射緩存鍵。 func被這個memoized函數的綁定調用。

// your collection 
const fruit = ["pear", "kiwi", "orange", "apple"] 

/* 
* a basic indexOf function that we can memoize. 
* @example 
* indexOf(fruit)('kiwi') // 1 
*/ 
const indexOf = list => Array.prototype.indexOf.bind(list) 

/* 
* a memoized version of IndexOf that is seeded with the list 
* @example 
* memoizedIndexOfA('kiwi') // 1 
*/ 
const memoizedIndexOfA = _.memoize(indexOf(fruit)) 

// the first time it is called in the `if` it is calculated 
if (memoizedIndexOfA("orange") !== -1){ 

    // the value was previously calculated, so retrieve from the cache. 
    console.log(memoizedIndexOfA("orange")) 
}