大写被破坏对象的值

Capitalize values of destructed object

我已经将 req.body 分解为:

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

现在我想将名称、owner.firstName、owner.lastname 和类别大写。 我该怎么做?

我试过了:

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

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

首先,注意几点:

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

您有两个选择:

  1. 使用变量(let),并为每个变量重复代码(或使用类似的循环);或
  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;

尽管如此,这四个更新似乎需要大量工作。 :-)

您可以采用所需的值并将字符串大写并将结果解构为给定的目标。

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

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

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)

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