【问题标题】:Assign, and set js object property conditionally有条件地分配和设置 js 对象属性
【发布时间】:2018-10-26 06:49:01
【问题描述】:

这是我的代码:

app.post('/ujfeladat', (req, res) => {
    const {nev, tipus, szid} = req.body;
    const hianyos = () => {
        if(tipus === 'hianyos'){
            return {rang: -1}
        }
        return
    }
    db('fl').insert({
        nev: nev,
        tipus: tipus,
        szid: szid,
        hianyos() //returns an error
    }).returning('*')
    .then(data => res.json(data))
    .catch(err => console.log(err))
})

只有在tipus === 'hianyos' 的情况下,我才能将rang 属性添加到对象?

【问题讨论】:

  • 如果存在未定义存储的 rang 或者您不想要任何与 rang 相关的内容,您是否可以?

标签: javascript


【解决方案1】:

更新答案:

您可以这样做

// Will result in { foo: 'foo', bar: 'bar'}
const item = {
  foo: 'foo',
  ... true && { bar: 'bar' },
  ... false && { falsy: 'falsy' },
}

console.log(item)

说明:

短路评估(true && {}false && {})将返回 ObjectBoolean false 值。

在返回Object 的情况下,它的属性会展开并分配给父对象。

在返回false 值的情况下,父对象没有被污染,因为ES6 将false, undefined, null and etc 值视为{}。因此传播...{} 不会为父对象分配任何属性。更多详情,可以找here.


原答案:

您可以这样做

db('fl').insert({
  nev: nev,
  tipus: tipus,
  szid: szid,
  ...tipus === 'hianyos' ? { rang: -1 } : {}
})

解释

如您所见,三元运算符总是返回一个对象

如果条件为true,则返回{ rang: -1 },否则返回空对象{}

之后,我们展开... 生成的对象(来自三元运算)并将对象的属性分配给父对象。

如果没有任何属性,则不会分配任何内容,这是我们的目标。

代码示例:有时几行代码胜过几千字

// Will result in { foo: 'foo', bar: 'bar'}
const item = {
  foo: 'foo',
  ... true ? { bar: 'bar' } : {},
  ... false ? { falsy: 'falsy' } : {},
}

console.log(item)

在其他答案中,我解释了相同的想法,但针对数组。你也可以查看here

【讨论】:

  • 哇!! 2 年前,你甚至不会认出它是 javascript :p
  • 非常感谢!有用!但是你能告诉这个语法的名字吗?
  • @GeraszHorváth 您可以查看详细信息。随意问:)
  • 只有传播是未知元素,但我确实读过它,它非常有用,但我还没有真正理解它,因为它有很多可能的使用形式。对象、数组、函数等等都有不同的含义。再次感谢您的回答,对我帮助很大!
  • 嗯。 @carinlynchin 感谢您的反馈!也许你必须考虑检查babeljs.io/docs/en/babel-plugin-proposal-object-rest-spread
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2021-05-29
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多