Javascript 仅当定义了变量时在对象中创建属性的速记方法

Javascript 仅当定义了变量时在对象中创建属性的速记方法,javascript,object,variables,properties,assign,Javascript,Object,Variables,Properties,Assign,正在寻找一种仅在定义赋值变量时才将属性赋值给对象的速记方法 当前代码: let count = {}, one = 1, two = 2, four = 4; if (one) count.one = one; if (two) count.two = two; if (three) count.three = three; if (four) count.four = four; 结果: 计数={1:1,2:2,4:4} 通常,我会尝试以下方法: let count = { one,

正在寻找一种仅在定义赋值变量时才将属性赋值给对象的速记方法

当前代码:

let count = {}, one = 1, two = 2, four = 4;
if (one) count.one = one; 
if (two) count.two = two; 
if (three) count.three = three; 
if (four) count.four = four; 
结果: 计数={1:1,2:2,4:4}

通常,我会尝试以下方法:

let count = { one, two, three, four }
然而,它抱怨当三是未定义的

是否有更好的方法仅在定义时进行速记分配

我不能拥有的:


count={1:1,2:2,3:undefined,four:4}

如果将可能未定义的项放在特定对象上,可能会更容易。例如,这不会给您带来困难:

const stuff = {
    one: 1, 
    two: 2, 
    four: 4
}

let count = {
    one: stuff["one"],
    two: stuff["two"],
    three: stuff["three"],
    four: stuff["four"]
}

console.log(count)

您可以创建一个函数来检查变量是否未定义,如果该变量未定义,则不将其添加到对象中

var count = {}, one = 1, two = 2, four = 4;

function addToObject(value){
 if(typeof value === 'undefined') return
 this.count[value] = value;
}

this.addToObject(this.one);
this.addToObject(this.two);
this.addToObject(this.three);
this.addToObject(this.four);
this.addToObject(this.five);

console.log(this.count);
// {1: 1, 2: 2, 4: 4}

只有当变量是全局变量并且可以通过窗口[名称]访问时,这才有效 您需要一个字符串列表,其中包含您试图获取的变量名

var target_list=[1,2,3,4], 计数={}, 一=1,二=2,四=4; 对于目标列表的let target{ 如果窗口[目标]{ 计数[目标]=窗口[目标]; }否则{ log`未找到变量[${target}]`; } } console.logcount; 它抱怨当三是未定义的

不,它只会在变量three未声明时抱怨,而不会在其值未定义时抱怨。您可以轻松解决此问题:

设一=1,二=2,三/*=3*/,四=4; const count=JSON.stringify{1,2,3,4};
console.logcount;这就产生了:{1:1,2:2,3:undefined,four:4}这是我定义的方法之一,我不能有…对不起,你想让这三个消失,还是不被定义?问题是,一旦你有了它的对象形式,它已经是:const stuff={1:1,2:2,four:4},所以这只是你的起点。你能举一个例子说明你想如何从一开始就操作它吗?如果三个是未定义的,我需要它来不创建属性。。。我试图将一组变量塞进一个对象中,但有些变量可能未定义。对于这一点,我不能在对象中包含它们。如果这些是对象上的键,比如说A,我认为这很简单,因为你已经有了对象A,而它只有你想要的键。您可以使用Object.keys列出它们。如果它们只是脚本中的变量,是否可能您不知道这些变量是否存在?未定义有什么错?任何使用该对象的代码在未定义属性和未定义值属性的情况下都应该是相同的。@Bergi它将以JSON格式保存到磁盘,并在分配空值或未定义值时占用空间。我还想让JSON变得整洁,便于直观查看。我试图避免那种混乱。但您说得有点对,主要目的是保存编码行并使其在程序中看起来整洁。最后,我将所有变量预先定义为null,并在最后使用let count={1,2,3,4},然后处理额外的混乱。预先定义为null使我可以毫无错误地声明整个内容。不!JSON只知道null,它不表示未定义。具有未定义值的属性不会显示在JSON.stringify结果中,它被视为从未创建过该属性。不要用null初始化变量,只需将它们声明为默认值undefined,这样就可以开箱即用了。没错,但我仍然有一个问题,就是在一行漂亮优雅的代码中声明JSON的变量,然后将其字符串化,而不会得到未定义变量的错误消息,除非您知道更好的JSON.stringify{one,two,three,four}方法,否则当three未定义时。如果变量的值未定义,您将不会收到错误消息-JSON.stringify{one,two,three,four}工作正常。如果变量没有声明,那就是代码中的一个错误-在使用它之前,你需要用let/const/var声明它。哦。。。我站对了。干得好谢谢,我相信这就是我需要的。我已经把你的答案选为正确答案,但由于我的声誉低于15,它不会显示出来。然而,我想如果你对我的问题投赞成票,我可能会在那一点上获得所需的信誉点。我现在所需要的是在所有变量都没有值的情况下移除{}的障碍。谢谢,它工作得很好。要检查对象是否为空,您可以将JSON字符串与{}进行比较,或者使用const obj={…};如果Object.valuesobj.everyv=>v!=空……啊。。。。还感谢您提供了关于接受答案的教程。完成并接受。还有一件事。。。在抓取站点时,我有时会得到一个空元素,并且希望在这种情况下不创建对象属性。。。也就是说,count.one=$'one'.val;如果值为空,有没有简单的单行方法不创建属性?您的意思是将空字符串视为未定义?您可以使用count.one=$'one.val | | undefined;来完成此操作;。仍然创建 属性,如果您不想这样做,您将无法绕过if语句。