如何让布尔值确定JavaScript对象值的顺序?

如何让布尔值确定JavaScript对象值的顺序?,javascript,Javascript,很抱歉标题有误,我真的想不出更好的方式来描述我的意思。这是我目前的代码: fromEn=true;//一些布尔值 选项={ from:fromEn?en:es, 致:fromEn?es:en }; 我希望from是真实的,而from是虚假的,我希望from是真实的。可以说,to应该是from的相反值。我觉得我当前的代码太冗余了,尽管它可以工作,但我还是想要一个更优雅的解决方案。有没有更好的方法来实现我的目标 编辑:我认为三方会谈是最好的方式。对于我选择做的事情,请看下面的答案,找到三种可能的解决

很抱歉标题有误,我真的想不出更好的方式来描述我的意思。这是我目前的代码:

fromEn=true;//一些布尔值 选项={ from:fromEn?en:es, 致:fromEn?es:en }; 我希望from是真实的,而from是虚假的,我希望from是真实的。可以说,to应该是from的相反值。我觉得我当前的代码太冗余了,尽管它可以工作,但我还是想要一个更优雅的解决方案。有没有更好的方法来实现我的目标


编辑:我认为三方会谈是最好的方式。对于我选择做的事情,请看下面的答案,找到三种可能的解决方案。谢谢大家的帮助

请使用const或let声明变量,这样这些变量就不会污染作用域

要回答您的问题,请切换fromEn


希望这有帮助。

请使用const或let声明变量,这样这些变量就不会污染作用域

要回答您的问题,请切换fromEn


希望这有帮助。

您可以使用属性获取程序。这种从和到的方式将动态变化,这取决于fromEn标志的值——我已将其移动到options对象中,将属于同一个对象的东西放在一起

让选项={ 弗罗门:是的, 从{返回this.fromEn?en:es}获取, 获取{返回此。fromEn?es:en} }; console.logFrom+options.from+to+options.to; options.fromEn=false;
console.logFrom+options.from+to+options.to 您可以使用属性getter。这种从和到的方式将动态变化,这取决于fromEn标志的值——我已将其移动到options对象中,将属于同一个对象的东西放在一起

让选项={ 弗罗门:是的, 从{返回this.fromEn?en:es}获取, 获取{返回此。fromEn?es:en} }; console.logFrom+options.from+to+options.to; options.fromEn=false;
console.logFrom+options.from+to+options.to 经过一些研究,我有三种可能的解决方案

第一个我会用的-谢谢使者

选项=fromEn?{from:'en',to:'es'}:{from:'es',to:'en'} 我提出的第二个建议是Bergi建议的——最初是按位或对0 | 0使用

常量langs=[es,en]; 常量选项={ from:langs[+fromEn], 致:langs[+!fromEn] } 第三次使用按位异或-谢谢托马斯

常量langs=[es,en]; 选项={from:langs[0^fromEn],to:langs[1^fromEn]};
第二个和第三个是相当不可读的,所以为了可读性,我更喜欢第1个。

经过一些研究,我有三种可能的解决方案

第一个我会用的-谢谢使者

选项=fromEn?{from:'en',to:'es'}:{from:'es',to:'en'} 我提出的第二个建议是Bergi建议的——最初是按位或对0 | 0使用

常量langs=[es,en]; 常量选项={ from:langs[+fromEn], 致:langs[+!fromEn] } 第三次使用按位异或-谢谢托马斯

常量langs=[es,en]; 选项={from:langs[0^fromEn],to:langs[1^fromEn]}; 第二个和第三个是相当不可读的,所以为了可读性,我更喜欢第1个。

fromEn=真; 让选项={} options.from=fromEn?en:es,options.to=fromEn?es:嗯 控制台。登录选项

fromEn=真; 让选项={} options.from=fromEn?en:es,options.to=fromEn?es:嗯
console.logoptions谢谢您的回答,欢迎使用Stack Overflow!我很欣赏你的解决方案,但它实际上与我的完全相同:在两个值中使用三元组,对fromEn进行两次评估。你的答案和我的问题只有一个感叹号不同。我在寻找一种更优雅的做事方式,而不是两种方式。不管怎样,谢谢你关于使用const和let的建议。谢谢你的回答,欢迎使用Stack Overflow!我很欣赏你的解决方案,但它实际上与我的完全相同:在两个值中使用三元组,对fromEn进行两次评估。你的答案和我的问题只有一个感叹号不同。我在寻找一种更优雅的做事方式,而不是两种方式。无论如何,感谢您对使用const和let的建议。您可以执行类似const args=[es,en];选项={from:args[0^fromEn],to:args[1^fromEn]}但这是否更好?我会怀疑的。我敢打赌,即使是你也会想,从现在开始的两个月内,^不是逻辑运算符。相反,它是一个操作符。我会找到options=fromEn?{from:'en',to:'es'}:{from:'es',to:'en'}虽然这实际上取决于个人喜好,但更为惯用。@Emissary对,或者const[from,to]=fromEn?[嗯,嗯]:[嗯,嗯];选项={from,to};或者@101arrows,如果你仍然在寻找那些你在查看时无法理解的肮脏黑客,下次:const[from,to]=[en,es,en].slice+fromEn;选项={from,to};。我喜欢

玩弄这类黑客,但它们永远不应该出现在生产代码中。不确定除了学术练习和使用大致相同数量的字符来获得相同的结果之外,所有这些不同的变体都能带来什么好处。你可以做一些类似于const args=[es,en];选项={from:args[0^fromEn],to:args[1^fromEn]}但这是否更好?我会怀疑的。我敢打赌,即使是你也会想,从现在开始的两个月内,^不是逻辑运算符。相反,它是一个操作符。我会找到options=fromEn?{from:'en',to:'es'}:{from:'es',to:'en'}虽然这实际上取决于个人喜好,但更为惯用。@Emissary对,或者const[from,to]=fromEn?[嗯,嗯]:[嗯,嗯];选项={from,to};或者@101arrows,如果你仍然在寻找那些你在查看时无法理解的肮脏黑客,下次:const[from,to]=[en,es,en].slice+fromEn;选项={from,to};。我喜欢玩弄这类黑客,但它们不应该出现在生产代码中。我不确定除了学术练习和使用大致相同数量的字符来获得相同的结果之外,所有这些不同的变体都能获得什么。谢谢你的回答,彼得!我想要更多的方法来避免双三元组,而不是动态地改变选项的值,但是我将来会使用这个方法,因为我从来都不知道js getter是如此容易制作的谢谢你的回答,Peter!我想要更多的方法来避免双三元组,而不是动态地更改选项的值,但我将来会使用这个方法,因为我不知道js getter这么容易制作,我会使用langs[+fromEn]/langs[+!fromEn]进行数字转换,而不是通常专门用于整数转换的| 0。但我想这两个都很好,而且远没有XOR那么奇怪。@Bergi根据其他一些StackOverflow答案,例如。-看第一条评论,一元+运算符的速度慢了97%,所以我选择了| 0。我怀疑这是真的,至少是测量转换本身,而不是数字的后续使用,但最重要的是,他们做的事情不同,所以要小心过早的优化。正如预期的那样,一旦你完成了所有的测试用例。97%的差异只存在于非常旧的引擎版本中,显然无法优化其中一个引擎和其他引擎。差别基本上可以忽略不计,你是对的。因为+运算符更具可读性和通用性,所以它是更好的选择。我会使用langs[+fromEn]/langs[+!fromEn]进行数字转换,而不是通常专门用于整数转换的| 0。但我想这两个都很好,而且远没有XOR那么奇怪。@Bergi根据其他一些StackOverflow答案,例如。-看第一条评论,一元+运算符的速度慢了97%,所以我选择了| 0。我怀疑这是真的,至少是测量转换本身,而不是数字的后续使用,但最重要的是,他们做的事情不同,所以要小心过早的优化。正如预期的那样,一旦你完成了所有的测试用例。97%的差异只存在于非常旧的引擎版本中,显然无法优化其中一个引擎和其他引擎。差别基本上可以忽略不计,你是对的。因为+运算符更具可读性和通用性,所以它是更好的选择。逗号运算符的分隔非常奇怪。为什么不只用两个语句和分号?@Bergi逗号怎么了?看起来很矮。精确,对我来说很微妙。也节省了一行我不知道这个答案有什么问题。逗号分隔在JavaScript中非常常见…@weegee用分号替换逗号同样简短、精确,但不那么微妙。如果不知道条件运算符和逗号运算符之间的优先级,则逗号运算符也是不明确的。保存行是迷你们的工作,而不是开发人员的工作。第二个代码段在各方面都要好得多。@Bergi我不理解最后一个注释,但如果你想摆弄javascript迷你程序,例如ifx{foo;return bar},否则{return 1}会变成return x?foo,bar:1字节。逗号运算符的分隔真的很奇怪。为什么不只用两个语句和分号?@Bergi逗号怎么了?看起来很矮。精确,对我来说很微妙。也节省了一行我不知道这个答案有什么问题。逗号分隔在JavaScript中非常常见…@weegee用分号替换逗号同样简短、精确,但不那么微妙。如果不知道条件运算符和逗号运算符之间的优先级,则逗号运算符也是不明确的。保存行是迷你们的工作,而不是开发人员的工作。第二个代码段在所有方面都要好得多。@Bergi我不理解最后一个注释,但是如果你继续摆弄javascript迷你程序,例如ifx{foo;return bar},否则{return 1}会变成return x?foo,bar:1字节已保存 .
const fromEn = true; // some boolean value

const options = {
  from: fromEn ? "en" : "es",
  to: !fromEn ? "en" : "es"
};