首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何简化Javascript中的三元表达式

如何简化Javascript中的三元表达式
EN

Code Golf用户
提问于 2017-05-18 03:55:09
回答 2查看 1.3K关注 0票数 5

我有一个表达方式,可以用以下两种之一来表达:

代码语言:javascript
复制
a += (A ? B ? x : C ? y : D : D);

a += (A && B ? x : A && C ? y : D);

其中A,B,C分别是5-10字节的表达式,x和y是单个字符文本(3-4字节)。D是另一条三元链(不存在分支问题)。

我被困在试图消除D或A的复制上,如果我使用的是if,应该是这样的:

代码语言:javascript
复制
if (A)
    if (B)
        x
    else if (C)
        y
else D

显然,我可以做((z=A) && B ? x : z && C ? y : D),...but,还有其他更有创意的建议吗?

实际代码看起来类似于:

代码语言:javascript
复制
if (r%4<2&&r>3&&c<22&&c>1)
    if ((i-r)%8==6)
        '\\'
    else if ((i+r)%8==1)
        '/'
else

D类似于:

代码语言:javascript
复制
(i+r) % 8 == 3 ? '/' : 
    (c-r+16) % 8 == 4 ? '\\' : 
EN

回答 2

Code Golf用户

回答已采纳

发布于 2017-06-12 15:10:28

如果您知道xy不能包含虚假价值,如代码示例所示,可以执行以下操作以消除对AD的重复计算:

代码语言:javascript
复制
a += A && (B && x || C && y) || D;

以下代码片段中的演示代码和测试用例:

代码语言:javascript
复制
// return x
test(1,1,0); // A and B
test(1,1,1); // A and B (and C)

// return y
test(1,0,1); // A and C

// return D
test(0,0,0); // 
test(0,0,1); // C
test(0,1,0); // B
test(0,1,1); // B and C
test(1,0,0); // A


function test(A, B, C) {
  var x = 'x', y = 'y', D = 'D';
  a = A && (B && x || C && y) || D;
  expected = (A && B ? x : A && C ? y : D);
  var ws = ' ';
  console.log(
    [
      A && 'A' || ws, 
      B && 'B' || ws, 
      C && 'C' || ws
    ].join(ws),
    ' ==> a = ' + a,
    a === expected ? 
      'Passed' : 
      'Failed, expected ' + expected
  );
}

否则,如果可能出现错误的值,您可以这样做:

代码语言:javascript
复制
a += [D, x, y][A && (B && 1 || C && 2) || 0];

以下代码片段中的演示代码和测试用例:

代码语言:javascript
复制
// return x
test(1,1,0); // A and B
test(1,1,1); // A and B (and C)

// return y
test(1,0,1); // A and C

// return D
test(0,0,0); // 
test(0,0,1); // C
test(0,1,0); // B
test(0,1,1); // B and C
test(1,0,0); // A


function test(A, B, C) {
  var x = false, y = 0, D = '';
  A = !!A; B = !!B; C = !!C;
  a = [D, x, y][A && (B && 1 || C && 2) || 0];
  expected = (A && B ? x : A && C ? y : D);
  var ws = ' ';
  console.log(
    [
      A && 'A' || ws, 
      B && 'B' || ws, 
      C && 'C' || ws
    ].join(ws),
    ' ==> a = ' + xyD(a, x, y, D),
    a === expected ? 
      'Passed' : 
      'Failed, expected ' + xyD(expected, x, y, D)
  );
}

function xyD(result, x, y, D) {
  return result === x ? 'x' :
         result === y ? 'y' :
         result === D ? 'D' : '<error>' ;
}
票数 2
EN

Code Golf用户

发布于 2017-05-18 04:22:38

由于这里不需要短路,您也可以这样做:

代码语言:javascript
复制
d=D;a+=A?B?x:C?y:d:d;

如果需要短路,因为您的BC是真实值,您可以这样做:

代码语言:javascript
复制
a+=(A?B?x:C?y:0:0)||D;

如果需要短路,并且您的BC不是真实值:

代码语言:javascript
复制
d=_=>D;a+=A?B?x:C?y:d():d();
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/121306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档