Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 如何递归查找对象键是否存在?_Javascript_Arrays_Object_Ecmascript 6 - Fatal编程技术网

Javascript 如何递归查找对象键是否存在?

Javascript 如何递归查找对象键是否存在?,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我有以下目标 acn: "02 0002 0002" id: "random" name: "random" parent_domain: "parent-random" subDomainData: {random-l3.1: {…}} sub_domains: ["random-l3.1"] timestamp: 1549597441 子域数据是另一个可能存在或不存在的对象。 如果它存在,它可以有另一个子域数据,可以有一个或一些子域,也可以没有子域,依此类推 我的疑问是如何创建一个递归检查

我有以下目标

acn: "02 0002 0002"
id: "random"
name: "random"
parent_domain: "parent-random"
subDomainData: {random-l3.1: {…}}
sub_domains: ["random-l3.1"]
timestamp: 1549597441
子域数据是另一个可能存在或不存在的对象。 如果它存在,它可以有另一个子域数据,可以有一个或一些子域,也可以没有子域,依此类推

我的疑问是如何创建一个递归检查它的函数,如果为真,将其对象推到另一个数组; 预期的最终数组如下所示:

[
    {
      acn: "02 0002 0002"
      id: "random"
      name: "random"
      parent_domain: ""
      sub_domains: ["random-l3.1"]
      timestamp: 1549597441
    },
    { // this object would be the result of the parent subDomainData Object.
      acn: "02 0002 0002"
      id: "random-sub-1"
      name: "random-sub-1"
      parent_domain: "parent-random"
      sub_domains: ["random-l3.3"]
      timestamp: 1549597441
    }
  ]
现在,我正在采用这种方法,但事实证明这是不够的:

formatDomainList = () => {
const { domain } = this.props;
const domainList = Object.values(domain.subDomainData);
domainList.map(item => (
  Object.keys(item.subDomainData).length && (
    domainList.push(item.subDomainData)
  )
  //etc
  //etc
));
// console.log('domain list', domainList);

}

类似这样的东西对您很有用:

//This is your original object
var someObject = {
  acn: "02 0002 0002",
  id: "random",
  name: "random",
  parent_domain: "parent-random",
  subDomainData: { someObjectWith_subDomainData },
  sub_domains: ["random-l3.1"],
  timestamp: 1549597441
 };
 //This will store the list of subDomains in this global variable.
 var subDomainList = [];

 function getSubDomainList(objectToLoop){

  if(objectToLoop.hasOwnProperty('subDomainData')){
    var numOfItems = Object.keys(objectToLoop.subDomainData).length;
    var keys = Object.keys(objectToLoop.subDomainData);
    for(var i = 0; i< numOfItems; i++){
        var key = keys[i];
        var obj = objectToLoop.subDomainData[key];
        subDomainList.push(obj);
        getSubDomainList(obj);
    }
   }
   return;
 }

 getSubDomainList(someObject);
 //The subDomainList will have the array of objects.
//这是您的原始对象
var someObject={
acn:“02 0002 0002”,
id:“随机”,
名称:“随机”,
父域:“父随机”,
subDomainData:{someObjectWith_subDomainData},
子域:[“random-l3.1”],
时间戳:1549597441
};
//这将在此全局变量中存储子域列表。
var子域列表=[];
函数getSubDomainList(objectToLoop){
if(objectToLoop.hasOwnProperty('subDomainData')){
var numOfItems=Object.keys(objectToLoop.subDomainData).length;
var keys=Object.keys(objectToLoop.subDomainData);
对于(变量i=0;i
我猜您的数据格式是错误的,将第一个对象包装到属性中,为我提供了所需的输出

var sourceObj={
“直到-11.1”:{
_id:“域/8999693”,
_钥匙:“8999693”,
_修订版:“YFjlOei--”,
acn:“01 0001 0001”,
激活:false,
id:“直到”,
名称:“直到付款”,
时间戳:1549838701,
子域:[“till-l2.1”、“till-l2.2”],
父域:空,
子域数据:{
“直到-l2.1”:{
_id:“域/8999741”,
_钥匙:“8999741”,
_修订版:“YFgLFKW--”,
acn:“02 0002 0002”,
激活:false,
id:“直到-l2.1”,
名称:“直到l2-1”,
时间戳:1549597441,
子域:[“直到-l3.1”],
父域:“直到”,
子域数据:{
“till-l3.1”:{
_id:“域/9001753”,
_钥匙:“9001753”,
_修订版:“YFghVqi--”,
acn:“,
是的,
id:“直到-l3.1”,
名称:“直到l3.1”,
时间戳:1549598900,
子域:[],
父域:“直到-l2.1”,
子域数据:{},
访问域:[]
}
},
accessDomains:[“直到-l3.1”]
},
“直到-l2.2”:{
_id:“域/8999780”,
_钥匙:“8999780”,
_修订:“YFgLcri--”,
acn:“02 0002 0002”,
激活:false,
id:“直到-l2.2”,
名称:“直到l2-2”,
时间戳:1549597465,
子域:[],
父域:“直到”,
子域数据:{},
访问域:[]
}
},
accessDomains:[“直到-l2.1”、“直到-l2.2”、“直到-l3.1”]
}
};
var结果=[];
const checkSubDomainData=obj=>{
Object.keys(obj.forEach)(key=>{
if(obj[key].subDomainData!=={}){
让innerObjs=obj[key]。子域数据;
删除obj[key]。子域数据;
结果.推送(obj[键]);
checkSubDomainData(innerObjs);
}否则{
返回;
}
});
};
checkSubDomainData(sourceObj);

控制台日志(结果)
看起来不像是在递归调用
formatDomainList
@CertainPerformance edited,抱歉。您可以通过jsonblob.com或something@VarunTheFalcon在这里。我怀疑你是否可以使用胖箭头函数进行递归函数调用。我的建议是编写普通函数并递归调用它。如果给定对象的subDomainData属性不存在,则中断递归。在这种情况下,没有子对象。刚才根据您的JSON编辑了我上面的解决方案。您的子域数据是一个可以有多个键的对象。这些键的每个对象都会有子域数据。只是修改了我的代码让它工作。试试这个。稍微调整一下,让它适合你。我还没有为你的JSON运行代码,但它应该可以工作。很抱歉,这段代码不起作用。。。对于给定的JSON数据,结果数组应该有4个对象。。。您的代码只提供3个对象作为输出,其中不包括父对象“_id”:“domains/8999693”