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

Recursive counting in arbitrary nested object

我正在尝试做一些数据可视化并处理这个数据集。具有任意嵌套对象的对象。我正在尝试计算键中出现不同值的次数。这只是数据集的一个片段,在原始数据中,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: []
        }]
        },
    ],
  }];

我在想我将不得不执行递归或展平类型的操作。所以我可以将所有 type 值放入这样的数组中。

我要实现的目标:

[ 'drink', 'drink', 'chips', 'chips', 'parent' ]

我需要打开 owns 以便正确计算 type 值。我觉得有两种方法可以解决这个问题。要么递归深入一个对象。或展平物体,使所有嵌套都在同一水平面上。我可能会将 Object[keys].filter.some.reduce 结合使用。但是我对如何以及以什么顺序感到困惑,并且希望得到一些帮助!这是我的伪装:

  1. if(对象键的类型是对象)
  2. && if (object's key === "type")
  3. 然后将 type.value 推入数组
  4. else if(对象键的类型!===对象)
  5. 然后 return 新的排序数组

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

你可以写一个简单的递归flatten-

const flatten = ({ type, owns = [] }) =>
  [ type, ...owns.flatMap(flatten) ]
 
const input =
  [{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:[]}]}]}]
 
console.log(input.flatMap(flatten))

[
  "parent",
  "chips",
  "chips",
  "drink",
  "drink"
]

这是我的解决方案。您可以使用 reduce 函数来完成。

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: []
        }]
        },
    ],
  }];

    let arr = []
const formattedData = (data) => data.reduce((acc, curr) => {
   arr.push(curr.type);
  
  if (Array.isArray(curr.owns)) {
    formattedData(curr.owns)
  }
  
  return arr;
  
}, []);
  
 console.log(formattedData(companyData))

使用简单的递归...

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: [] }] },], }];

function mapTypes(arr, acc = []) {
  for (const o of arr) {
    acc.push(o.type);
    if (o.owns.length > 0) {
      acc = mapTypes(o.owns, acc)
    }
  }
  return acc;
}

console.log(mapTypes(companyData));