2016-12-30 93 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")) 
}