Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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_Recursion - Fatal编程技术网

Javascript 递归嵌套对象以查找属性,并将其添加到数组(如果存在)

Javascript 递归嵌套对象以查找属性,并将其添加到数组(如果存在),javascript,recursion,Javascript,Recursion,我试图遍历对象,查找嵌套结构中始终具有相同名称的属性或键子属性。对象可以在不同级别上拥有一次或多次,而不必使用 这是我当前的伪代码 检查obj是否具有属性subperty 如果没有,则返回false 如果有,则深入一层(obj.subperty),检查它是否具有属性subperty,依此类推 我想递归地做,,但我无法下定决心。有人能帮我使用递归函数来检查每个级别是否有该属性,如果有,将true推送到数组中吗 const obj = { level1: 'level 1', subProp

我试图遍历
对象
,查找嵌套结构中始终具有相同名称的属性或键
子属性
。对象可以在不同级别上拥有一次或多次,而不必使用

这是我当前的伪代码

  • 检查
    obj
    是否具有属性
    subperty

  • 如果没有,则返回
    false

  • 如果有,则深入一层(obj.subperty),检查它是否具有属性
    subperty
    ,依此类推

  • 我想递归地做
    ,但我无法下定决心。有人能帮我使用递归函数来检查每个级别是否有该属性,如果有,将true推送到数组中吗

    const obj = {
      level1: 'level 1',
      subProperty: {
        level2: 'level 2',
        subProperty: {
          level3: 'level 3'
        }
      }
    }
    
    
    我正在努力学习和理解递归
    非常感谢您的帮助。

    hasOwnProperty
    可以检查对象是否具有指定为参数的属性。您可以创建while循环以继续,直到找到不具有子属性的属性。下面是一个简短的脚本,演示了执行此操作的函数。它将返回数组,可以继续的所有时间都为true,最后一次为false

    const obj={
    级别1:“级别1”,
    副专利:{
    二级:“二级”,
    副专利:{
    三级:“三级”
    }
    }
    }
    函数GetSubpertyRecursive(obj,Subperty){
    propertyArray=[];
    currentObj=obj
    while(currentObj.hasOwnProperty(subperty)){
    currentObj=currentObj[子属性];
    propertyArray.push(true);
    }
    propertyArray.push(false);
    返回属性数组;
    }
    
    log(getsubpertyrecursive(obj,“subperty”)
    对于没有
    子属性的级别,可以返回一个带有
    false
    的数组,否则返回
    true
    和函数递归调用的结果

    函数getLevels({subperty}){
    if(subperty==未定义)返回[false];
    返回[true,…getLevels(subperty)];
    }
    常数
    对象={level1:'level1',子属性:{level2:'level2',子属性:{level3:'level3'}},
    级别=获取级别(对象);
    
    控制台日志(级别)我认为所问的问题并不能真正帮助您了解递归。根据定义,该函数将始终返回
    false
    (除非您有一个循环对象,该对象可能会不断重复,直到堆栈耗尽为止)

    因此,我认为这里有一个变体会有所帮助:我们可以返回第一个嵌套对象,而不返回属性
    子属性,而不是返回
    false
    。因此,对于示例对象,这应该返回对嵌套的
    {level3:'level3'}
    对象的引用

    因为我们的数据结构显然是递归的,所以这里是使用递归解决方案的好地方。这里有一种可能性:

    const levelwithout子属性=函数(obj){
    if(obj中的“子属性”){
    返回级别不带子属性(对象子属性)
    }
    返回obj;
    }
    const obj={level1:'level1',子属性:{level2:'level2',子属性:{level3:'level3'}}
    控制台日志(
    levelWithoutSubProperty(obj)/~>{level3:'level3'}
    
    )
    所以这个函数总是返回
    false
    ,但这样做可能需要任意长的时间?请添加想要的结果。那么,您的问题是什么?