基本上,我想知道如果变量为false,但在对象内部,我是否可以避免向对象中添加属性。假设我有一个对象:
var obj = { foo: 'bar', bar: 'foo' };
现在我想重写同一个对象,但我只想在一个布尔值的新变量为true时添加第二个属性。问题是我怎么能做到这一点,例如用这样的三元运算符:
var add = false;
var obj = {
foo: 'bar',
(add ? bar: 'foo': null)
};
我想避免的是:
...
bar: ( add ? 'foo' : undefined )
因为我不想在add==false的情况下使用条形索引。此外,赋值必须在对象内部(如果可能的话,这就是问题所在),因为像这样的东西不是我想要的:
...
if (!add) delete obj.bar; // This would be after the creation of the whole object
解决方案
显然,这可以通过多种方式实现,但我还没有发现任何在对象内部实现的方法。我可以使用一个三元运算符,并有两个这样的对象:
var obj = add ? {
foo: 'bar',
bar: 'foo'
} : { foo: 'bar' };
但这会导致代码重复(当对象具有更多属性时)。
编辑我想说我的问题与重复的问题略有不同,因为我的问题指的是在对象内部执行,而不是在其声明之后,也不是在var obj = { ... }
之间有一个公认的答案,但如果有人知道在不使用扩散运算符的情况下有其他方法,我会很高兴的。谢谢大家
使用排列运算符的快速方法:
const condition = false;
const foo = {
bar: 'baz',
...(condition ? {
boz: 'bat'
} : {})
};
console.log(foo);
这是因为对象文字的扩散运算符对没有可枚举自身属性的对象不起任何作用。
为了达到预期的结果,使用下面的选项,根据单行中的条件添加推进器
https://codepen.io/nagasai/pen/ebQmrb?editors=1010
var add = false;
var obj = { foo: 'bar'};
if(add){
obj.bar = 'foo'
}
console.log(obj)
选项2:如果条件为false,则为bar使用未定义的值,并使用JSON.stringify和JSON.parse删除条件为false 时未定义的"bar"属性
var add = false;
var obj = JSON.parse(JSON.stringify({ "foo": 'bar', "bar" : add? 'foo': undefined}));
console.log(obj);
代码笔-https://codepen.io/nagasai/pen/zyMgxj?editors=1010