Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在对象内部用0替换未定义的对象的最佳方法是什么?_Javascript_Object - Fatal编程技术网

Javascript 在对象内部用0替换未定义的对象的最佳方法是什么?

Javascript 在对象内部用0替换未定义的对象的最佳方法是什么?,javascript,object,Javascript,Object,以下是示例对象: 对象内的值实际上不称为value1、value2等 他们都有不同的名字 数据是从api获得的数据 let object = { id: '1', gen: { value1: data.value1, value2: data.value2, value3: data.value3, value4: data.value4, // etc }, somethingelse: { one: { value1:

以下是示例对象:

对象内的值实际上不称为value1、value2等

他们都有不同的名字

数据是从api获得的数据

let object = {
  id: '1',
  gen: {
    value1: data.value1, 
    value2: data.value2,
    value3: data.value3,
    value4: data.value4, // etc 
  },
  somethingelse: {
    one: {
      value1: data.value1,
      value2: data.value2,
      value3: data.value3,
      value4: data.value4, // etc 
    },
    two: {
      value1: data.value1,
      value2: data.value2,
      value3: data.value3,
      value4: data.value4, // etc 
    },
    three: {
      value1: data.value1,
      value2: data.value2,
      value3: data.value3,
      value4: data.value4, // etc 
    }
  }
};
我知道我可以在每个代码中添加| | 0,但这将是很多难看的代码 有时还会有数学运算返回NaN 我不能只做:
如果object.value1 object.value1=0因为我需要100行重复的代码来完成此操作

您可以将相同的逻辑应用于具有更多循环的更深层次的对象:

for(let key in myObject) {
   if(myObject[key] === undefined || myObject[key] === null)
       myObject[key] = 0;
}

如果您迭代的对象中有更多的对象,则可以使用键中的键等等。

您可以使用递归将未定义的替换为使用递归的0

常量数据={} 让object={id:'1',gen:{value1:data.value1,value2:data.value2,value3:data.value3,value4:data.value4,},somethingelse:{one:{value1:data.value1,value2:data.value2,value3:data.value3,value4:data.value4,},两个:{value1:data.value1:data.value1,value3:data.value3,value4:data.value4,},三个:{value1:data.value1,value2:data.value2,value3:data.value3,value4:data.value4,}}; 函数removeUnfobj{ obj中的forlet键{ ifobj[key]&&typeofobj[key]==对象{ removeUnfobj[键] } else obj[key]=obj[key]==未定义?0:obj[key] } } 移除目标;
console.logobject如果您可以使用ES6,您可以将数据包装成一个返回0而不是未定义的值。然后使用该值使您的对象:

设real_data={value1:10,value2:2} //真实数据代理 让数据=新的Proxyreal\u数据{ 获取目标、名称、接收者{ 让val=Reflect.gettarget,name,receiver; 返回值===未定义?0:val } }; //现在就使用数据 让object={id:'1',gen:{value1:data.value1,value2:data.value2,value3:data.value3,value4:data.value4,},somethingelse:{one:{value1:data.value1,value2:data.value2,value3:data.value3,value4:data.value4,},两个:{value1:data.value1:data.value1,value3:data.value3,value4:data.value4,},三个:{value1:data.value1,value2:data.value2,value3:data.value3,value4:data.value4,};
console.LogoObject您是如何创建此对象的?您可以使用递归并在创建对象后更新对象,但这似乎会适得其反。您可以使用data.value1 | | 0,如果data.value1未定义或为null,或者在ecmascript中为假值,则它将取0,否则它将取data.value1值。是否可以将实际的API结果添加为excerpt?使用| | 0是一种可行的方法,当然可以通过某种循环来保存重复。但是,如何做到这一点取决于实际数据的结构,是否有其他非数值,是否只需要格式化某些部分,是否必须递归地完成等。请创建一个。我相信您会没有在每个嵌套的obejct中使用data.value1。问题是api没有返回未定义的my对象,而是返回它。如果它的undefined@Beke,这不是与本例中的情况类似吗?对于键value3和value4,real_数据没有任何值?对于任何未定义或定义为unde的键,这将返回0罚款。