首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现代JavaScript中的条件级联

现代JavaScript中的条件级联
EN

Stack Overflow用户
提问于 2021-06-04 02:49:43
回答 4查看 593关注 0票数 2

我在寻找一种有条件地连接字符串的简洁方法。

请参见:

代码语言:javascript
复制
const something = response.data
  .map(i => {
    const id = i.Attachments?.[0]?.Id
    return { image: id ? "/servlet/servlet.FileDownload?file=" + id : undefined, ...i }
  })

我很想把这个插进去,但找不到办法。使用像('something' + foo) ?? undefined这样的零coelescing op永远不会被解析为未定义。

编辑:如果没有Id,我想将其最小化为.map(i => ({image: "/servlet/servlet.FileDownload?file=" + i.Attachments?.[0]?.Id, ...i})),但image是空的。我希望在某个地方有个巧妙的技巧。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-06-04 03:24:08

当今大多数编程语言的一个痛点是无法(或很难)表达条件字符串格式操作(我想知道这是否是一个逐个语言的阴谋-设计者不鼓励我们使用字符串,毕竟,字符串是昂贵的,没有GC就可以管理一个皮塔)。但由于这是JavaScript,总有一个核选择:扩展String.prototype

代码语言:javascript
复制
String.prototype.p = a => this ? (a+this) : undefined;

这意味着您的代码可以保留其原始形式,但可以转换为:

代码语言:javascript
复制
const something = response.data
  .map(i => {
    return { image: (i.Attachments?.[0]?.Id||'').p("/servlet/servlet.FileDownload?file="), ...i }
  })

然后又缩短为:

代码语言:javascript
复制
const something = response.data
  .map(i => ({image: (i.Attachments?.[0]?.Id||'').p("/servlet/servlet.FileDownload?file="), ...i }))

更新:现在我已经睡过了,下面是生活版:

代码语言:javascript
复制
const something = response.data
  .map(i => ({image: (s=>s?("/servlet/servlet.FileDownload?file="+s):undefined)(i.Attachments?.[0]?.Id), ...i }))

再次收缩以求好运:

代码语言:javascript
复制
const something = response.data.map(i=>({image:(s=>s?("/servlet/servlet.FileDownload?file="+s):void 0)(i.Attachments?.[0]?.Id),...i}))

总共135个字符。

票数 2
EN

Stack Overflow用户

发布于 2021-06-04 03:25:52

我想我看到你在找什么了。您希望能够在不将表达式样式箭头函数转换为语句样式箭头函数的情况下内联重用复杂表达式。在这些情况下,可以使用表达式赋值。

代码语言:javascript
复制
const answer = (x=complex_expression?.[0]?.Id, x && "long/string.With/stuff"+x);

下面是一个使用该方法的示例:

代码语言:javascript
复制
const something = response.data.map(i => ({
  image: (id=i.Attachments?.[0]?.Id, id && "/servlet/servlet.FileDownload?file=" + id),
  ...i,
}));

如果不希望图像键是null,则可以这样做:

代码语言:javascript
复制
const something = response.data.map(i => ({
  ...(id=i.Attachments?.[0]?.Id, id && { image: "/servlet/servlet.FileDownload?file=" + id}),
  ...i,
}));
票数 1
EN

Stack Overflow用户

发布于 2021-06-04 03:00:12

这就是你要找的吗?

代码语言:javascript
复制
const something = response.data
  .map(i => ({ 
     image: i.Attachments?.[0]?.Id && "/servlet/servlet.FileDownload?file=" + i.Attachments?.[0]?.Id,          
     ...i 
     })
  );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67830885

复制
相关文章

相似问题

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