是否有一个“问题”;而";可以在JavaScript中的插入语句中使用的等效语句?

是否有一个“问题”;而";可以在JavaScript中的插入语句中使用的等效语句?,javascript,functional-programming,shortcut,Javascript,Functional Programming,Shortcut,我经常发现JavScript快捷方式很有用,比如替换if/else语句,比如 if (a !== 0) { b = c; } else { b = d; } 与 或者替换for/next循环,如 for (let i = 0; i < array.length; i++) { element = array[i]; /* do something with element... */ } 我特别喜欢这些快捷方式和其他类似的快捷方式可以组合使用在附加语句中,例如 arra

我经常发现JavScript快捷方式很有用,比如替换if/else语句,比如

if (a !== 0) {
  b = c;
} else {
  b = d;
}

或者替换for/next循环,如

for (let i = 0; i < array.length; i++) {
  element = array[i];
  /* do something with element... */
}
我特别喜欢这些快捷方式和其他类似的快捷方式可以组合使用在附加语句中,例如

array.forEach(e => (x += e ? a : b, e * x));
array.forEach(e => (x += e ? a : b, e * x));
(工程)

然而,我还没有找到一个快捷方式或功能相当于括号内的“while”语句。有这样的事吗

我试图在括号内使用普通while语句,但出现了一个错误

array.forEach(e => (while (e.length > 160) { e.replace(' ', ''); }, e));
array.forEach(e => (while (e.length > 160) { e.replace(' ', ''); }, e));
(不起作用)

我知道上面的内容可以改写成更长的形式,就像这样

array.forEach(e => {
  while (e.length > 160) {
     e.replace(' ', '');
  }
  return e;
});
array.forEach(e => {
  while (e.length > 160) {
     e.replace(' ', '');
  }
  return e;
});
(工程)

但有时我真的更喜欢与while相当的内联速记,而不是长版本。有没有办法做到这一点?

您可以使用递归:

const cutSpace = str => str.length > 160
  ? cutSpace(str.replace(' ', ''))
  : str

const trimmedStrings = array.map(cutSpace)

如果在循环中执行单个命令,可以使用for循环

array.forEach(e => for(; e.length > 160; e.replace(' ', ''));return e;})

这可能不短,但它是功能性的:

const数组=[
'       ',
'      ',
'     ',
'    ',
'   ',
'  ',
' ',
'',
];
const result=array.map(e=>(f=>(g=>x=>f(g(g))(x))(h=>x=>f(h(h))(x))(f=>e=>e.length>2&&f(e.replace('',)|e)(e));
控制台日志(结果)
我特别喜欢这些快捷方式和其他类似的快捷方式可以组合使用在附加语句中,例如

array.forEach(e => (x += e ? a : b, e * x));
array.forEach(e => (x += e ? a : b, e * x));
(工程)

什么?此代码以什么身份“工作”?如果我在审查中看到这段代码,我会立即拒绝它

  • 谓词中的外部状态突变
  • 然而,在一个循环中
  • 更不用说既不使用
    a
    也不使用
    b
  • 更不用说括号和尾随的
    e*x
    表达式也被完全丢弃了。。。(?)
太糟糕了,很痛

我试图在括号内使用普通while语句,但出现了一个错误

array.forEach(e => (while (e.length > 160) { e.replace(' ', ''); }, e));
array.forEach(e => (while (e.length > 160) { e.replace(' ', ''); }, e));
(不起作用)

这是一个语法错误。您试图使用语句,其中只允许使用表达式。像
if
for
while
do
之类的语句都是语句。不能将语句放入
(…)
表达式中。即使您可以在这里使用
while
表达式,代码仍然不会做任何事情。所有的计算都被完全丢弃了

我知道上面的内容可以改写成更长的形式,就像这样

array.forEach(e => {
  while (e.length > 160) {
     e.replace(' ', '');
  }
  return e;
});
array.forEach(e => {
  while (e.length > 160) {
     e.replace(' ', '');
  }
  return e;
});
(工程)

“工作”?这是怎么回事?从语法上来说,这是可以的,但实际上它什么都不做

  • 字符串是不可变的,所以
    String.prototype.replace
    不会像我想象的那样变异
    e
  • Array.prototype.forEach
    忽略迭代器函数中的返回值
  • Array.prototype.forEach
    本身没有返回值

我只能假设你想做这样的事

让输入=[
“a b c d e f g h”,
“我不知道”,
"p q r s t u",,
“v w x y z”
]
input.forEach(e=>{
而(e.长度>9)
e=e.替换(“”,“”)
控制台日志(e)
})
//abcdefg h
//吉隆坡
//pqr s t u

//v w x y z
您的“长格式”示例与“短格式”示例的长度完全相同,除了空白格式。唯一的区别是正确地使用大括号而不是括号。while循环可能结束,也可能永远不会结束。如果传入一个由161个以上非空格字符组成的字符串,则永远不会离开while循环。无论如何,我不知道你为什么要循环它;replace将在一次调用中获取角色的所有实例。此外,看起来您的单行版本中有语法错误。@SteveH。我认为关键是他想使用逗号运算符,而不是返回语句。最多可以使用逗号运算符,因为它需要一个谓词函数(
e.length>160
),循环体函数。也就是说,如果您希望它是完全通用的。如果JS有一个宏系统,那么你可以做一些简短的事情。条件表达式的要点是有一个返回值,而不是作为If语句的快捷方式。这就是为什么while循环没有等价的表达式:它们没有返回值。您实际上似乎在寻找的是数组
reduce
方法。顺便问一下,是否有人可以澄清我的示例是否适合进行适当的尾部调用优化,或者我应该否定谓词并在“else表达式”中调用
cutSpace
?不管你把它放在哪个分支,这都是一个尾部调用。这是最好的答案我接受了这个答案,因为它用最少的代码解决了问题(这就是我一直在寻找的)。@DSchnellDavis你谈论“快捷方式”的次数让我非常痛苦。分配给
e
也不完全起作用,是吗?@Bergi肯定,删除该任务就是代码。我只是用它来证明OP的较长版本没有任何作用,因为没有作业。那为什么这个被否决了呢?它似乎回答了这个问题,而且似乎是迄今为止最紧凑的版本。没关系,我找到了答案。这可能是一个聪明的想法,但行不通。当我试图在一个附加语句中使用这个时,我得到了一个错误,就像我在while语句中得到的一样。所以我并没有真正提供你问题的答案,相反,这个答案解释了你基本上找错了方向。很明显,您的主要目标是保持代码“简短”——这是一个笑话,考虑到正确的结构远比问题中代码片段中出现的巧妙语法汤重要。
for
while
没有本质上的错误,您可以在程序中维护函数接口,即使某些函数可能在本地使用这样的语句。TL:D