【问题标题】:Capitalize values of destructed object将被破坏对象的值大写
【发布时间】:2020-11-17 01:36:45
【问题描述】:

我已将req.body 解构为:

const {
      logo = randomImg,
      category,
      name,
      owner,
      phone = "NA",
      location = "NA",
      website = "NA",
    } = req.body;

现在我想将 name、owner.firstName、owner.lastname 和 category 大写。 我该怎么做?

我试过了:

[category,name].forEach((s)=>{
  if (typeof s !== 'string') return ''
  return s.charAt(0).toUpperCase() + s.slice(1)
})

但这似乎并没有改变实际值。 提前致谢

【问题讨论】:

  • typeof s ?大概应该是单词...
  • Consdier 使用 map 而不是 forEach。
  • @sonic true 数据。
  • 我感受到你的痛苦。我无法告诉你我希望能够多久通过某种转换函数运行一个解构值。
  • @T.J.Crowder 好消息是,jsfiddle.net/adigas/qtx839Lu 是可能的。但是,你也会得到一些东西。

标签: javascript node.js object ecmascript-6 destructuring


【解决方案1】:

首先,请注意几点:

  • 您无法更改const 的值。这就是他们的目的。 :-)
  • 没有人关注forEach的返回值。
  • 即使是这样,也不会知道这些返回值如何与您的常量匹配。

你有几个选择:

  1. 使用变量(let),并为每个变量重复代码(或使用类似Nina's的循环);或
  2. 不要使用解构(至少在最初)

重复并不全是那么不好(如果您使用可重用的toTitleCase 函数或类似的函数——无论如何您都想做,甚至可能使用toTitleCaseOrBlank 来处理typeof 检查);你只更新了四件事。

但假设您不想这样做,您可以制作req.body 及其owner 对象的浅表副本,更新该浅表副本,然后然后从该副本中解构:

const copy = {...req.body, owner: {...req.body.owner}});
["name", "category"].forEach(name => copy[name] = toTitleCaseOrBlank(copy[name]));
["firstName", "lastName"].forEach(name => copy.owner[name] = toTitleCaseOrBlank(copy.owner[name]));
const {
    logo = randomImg,
    category,
    name,
    owner,
    phone = "NA",
    location = "NA",
    website = "NA",
} = copy;

不过,四次更新似乎需要做很多工作。 :-)

【讨论】:

  • 谢谢,@Nina 的答案似乎就是我想要的。
  • @MendiSterenfeld - 是的,很可爱。对我来说,与仅仅为四个项目编写四行代码相比,这是矫枉过正的,但这是一个判断电话。注意:如果您完全按原样使用她的代码,您将直接修改req.body,我认为上面不是您想要做的事情。 :-)
【解决方案2】:

您可以获取所需的值并将字符串大写并将结果分解为给定的目标。

[name, owner.firstName, owner.lastname] = [name, owner.firstName, owner.lastname]
    .map(s => typeof s === 'string'
        ? s[0].toUpperCase() + s.slice(1)
        : s
    );

【讨论】:

  • 为什么投反对票?是的,namecategoryconst,但这很容易解决。
【解决方案3】:

因此,我能想到的解决此问题的最简单方法是不要解构那些您将要更改的变量。而是直接创建新变量。类似于以下内容:

const toTitleCase = input -> typeof s === 'string'
        ? s[0].toUpperCase() + s.slice(1)
        : s

const name = toTitleCase(req.body.name);
const category = toTitleCase(req.body.category);

const {
      logo = randomImg,
      owner,
      phone = "NA",
      location = "NA",
      website = "NA",
    } = req.body;

owner.firstName = toTitleCase(owner.firstName)
owner.lastName = toTitleCase(owner.lastName)

这种方法避免了循环的复杂性,但如果您想要标题大小写的事物列表很长或受到动态变化的影响,您可能希望使用其中一种循环方法。

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多