Javascript 任意嵌套对象的递归计数

Javascript 任意嵌套对象的递归计数,javascript,reactjs,recursion,flatten,Javascript,Reactjs,Recursion,Flatten,我试图做一些数据可视化和处理这个数据集。具有任意嵌套对象的对象。我试图计算一个键中出现不同值的次数。这只是数据集的一个片段,在原始版本中,拥有嵌套对象的深度超过7级 我正在使用的示例数据集: var companyData = [{ company: 'Pepsico', type: 'parent', owns: [ { company: 'Cheetos', type: 'chips', owns: [{

我试图做一些数据可视化和处理这个数据集。具有任意嵌套对象的对象。我试图计算一个键中出现不同值的次数。这只是数据集的一个片段,在原始版本中,
拥有
嵌套对象的深度超过7级

我正在使用的示例数据集:

var companyData = [{
    company: 'Pepsico',
    type: 'parent',
    owns: [
      {
      company: 'Cheetos',
      type: 'chips',
      owns: [{
        company: 'CheezyChipCo',
        type: 'chips',
        owns: []
      }]
      },
      {
        company: 'Gatorade',
        type: 'drink',
        owns: [{
          company: 'Powerade',
          type: 'drink',
          owns: []
        }]
        },
    ],
  }];
[ 'drink', 'drink', 'chips', 'chips', 'parent' ]
我想我必须做一个递归或扁平类型的操作。所以我可以把所有的
类型
值放入这样的数组中

我正在努力实现的目标:

var companyData = [{
    company: 'Pepsico',
    type: 'parent',
    owns: [
      {
      company: 'Cheetos',
      type: 'chips',
      owns: [{
        company: 'CheezyChipCo',
        type: 'chips',
        owns: []
      }]
      },
      {
        company: 'Gatorade',
        type: 'drink',
        owns: [{
          company: 'Powerade',
          type: 'drink',
          owns: []
        }]
        },
    ],
  }];
[ 'drink', 'drink', 'chips', 'chips', 'parent' ]
我需要打开
owns
,以便正确计算
类型的值。我觉得有两种方法可以解决这个问题。要么递归深入对象。或者展平对象,使所有嵌套位于同一标高上。我可能会将
对象[键]
.filter
.some
结合使用。但我对如何以及以何种顺序进行感到困惑,我希望得到一些帮助!这是我的假想:

  • if(对象的键类型为对象)
  • &&如果(对象的键==“类型”)
  • 然后将该type.value推送到数组中
  • else if(对象键的类型!==对象)
  • 然后返回新的排序数组

  • 抱歉,真正的前端开发时间。我不知道这是否有意义,也不知道发布所有失败的代码尝试是否会有所帮助。

    您可以编写一个简单的递归
    展平
    -

    constflant=({type,owns=[]})=>
    [类型,…拥有.flatMap(展平)]
    常量输入=
    [{公司:'Pepsico',类型:'parent',拥有:[{公司:'Cheetos',类型:'chips',拥有:[{公司:'CheezyChipCo',类型:'chips',拥有:[]},{公司:'Gatorade',类型:'drink',拥有:[{公司:'Powerade',类型:'drink',拥有:[]}]
    
    console.log(input.flatMap(flatte))
    这是我的解决方案。您可以使用reduce函数来实现

    var companyData=[{
    公司:“百事可乐”,
    类型:'父',
    拥有:[
    {
    公司:“奇多”,
    键入:“chips”,
    拥有:[{
    公司:“CheezyChipCo”,
    键入:“chips”,
    拥有:[]
    }]
    },
    {
    公司名称:“佳得乐”,
    类型:“饮料”,
    拥有:[{
    公司:'Powerade',
    类型:“饮料”,
    拥有:[]
    }]
    },
    ],
    }];
    设arr=[]
    const formattedData=(data)=>data.reduce((acc,curr)=>{
    arr.push(电流型);
    if(Array.isArray(curr.owns)){
    格式化数据(当前拥有)
    }
    返回arr;
    }, []);
    console.log(格式化数据(公司数据))
    
    使用直接递归

    var companyData=[{公司:'Pepsico',类型:'parent',拥有:[{公司:'Cheetos',类型:'chips',拥有:[{公司:'CheezyChipCo',类型:'chips',拥有:[},{公司:'Gatorade',类型:'drink',拥有:[{公司:'Powerade',类型:'drink',拥有:[]},]},};
    函数映射类型(arr、acc=[]){
    用于(arr的常数){
    acc.push(o型);
    如果(o.o.length>0){
    acc=地图类型(o.owns,acc)
    }
    }
    返回acc;
    }
    
    日志(映射类型(companyData))
    在所需的输出中,您将丢失“所有权”关系的信息,因为“饮料”显然与“芯片”没有这种关系,但输出没有显示这一点。你确定这就是你需要的输出吗?是的,在这种情况下,关系数据不是什么大问题,因为它只与一家母公司,即百事公司打交道。预期的dataviz是多色点(即,绿色代表芯片,蓝色代表饮料)。我有一个数组计数函数rdy 2 go。我完全可以看到需要的关系数据,比如:如果你想看到一个拥有what Company的人,请悬停一下HichamELBSI!我使用performance.now()测试运行了您的函数,它的运行速度为0.03ms(使用示例数据集)。与其他的相比,这一个是目前最快的。实际上,在长度为1000的数组上运行它,迭代1000次,平均速度为0.09ms,简单的递归速度为0.06ms,糟糕的flatMap速度为2.01ms(每个都在Chrome上干净的控制台上独立运行)Dang truu!非常信任循环,感谢4 ur的循环解决方案pilchardwow。flatMap非常干净,谢谢哈哈。我使用performance.now()测试运行了它,它的平均运行速度为0.1-0.7ms。defs是否将尝试使用更大的数据集