【问题标题】:Merging nested objects by conditions more than 2 levels deep按超过 2 层深度的条件合并嵌套对象
【发布时间】:2019-06-06 23:50:12
【问题描述】:

我有一个非常简单的对象数组:

[
  { category: 'A', level: 'Aa', sublevel: 'Aaa' },
  { category: 'A', level: 'Aa', sublevel: 'Aab' },
  { category: 'A', level: 'Ab', sublevel: 'Abb' },
  { category: 'B', level: 'Ac', sublevel: 'Abc' }
]

子级别始终是唯一的,级别和类别可以相同。
我想从该数组创建以下对象:

[
  { 
    category: 'A',
    children: [
      {
        level: 'Aa',
        children: [
          {
            sublevel: 'Aaa'
          },
          {
            sublevel: 'Aab'
          }
        ]
      },
      {
        level: 'Ab',
        children: [
          {
            sublevel: 'Abb'
          }
        ]
      }
    ]
  },
  { 
    category: 'B',
    children: [
      {
        level: 'Ac',
        children: [
          {
            sublevel: 'Abc'
}] }] }]

换句话说,如果有两个具有相同类别的对象,我想将category 合并为一个,并将其级别放入数组children。如果还存在具有相同类别和级别的对象,则将相同级别合并为一个并将子级别放入相关数组children

使用[].map[].reduce 以及各种循环,遍历数组并没有真正奏效。还尝试了 lodash mergeWith 和 deepmerge,但子级别似乎对它们不可见。

在超过 2 层深度的条件下构造对象的优雅方法是什么?

【问题讨论】:

    标签: javascript javascript-objects nested-loops


    【解决方案1】:

    您只需要一个在原始数组上带有嵌套过滤器/映射的 reducer。

    const categories = base.reduce((accumulator, data) => {
      let category;
    
      if (!accumulator.find(d => d.category === data.category)) {
        category = {
          category: data.category,
          children: [],
        };
    
        base
          .filter(d => d.category === data.category)
          .map(d => {
            if (!category.children.find(c => c.level === d.level)) {
              category.children.push({ level: d.level, children: [] });
            }
    
            const level = category.children.find(c => c.level === d.level);
    
            if (!level.children.find(c => c.sublevel === d.sublevel)) {
              level.children.push({ sublevel: d.sublevel });
            }
          })
    
    
        accumulator.push(category);
      }
    
      return accumulator;
    }, []);
    

    【讨论】:

    • 我知道reduces 万能的,你又说明了。谢谢!
    猜你喜欢
    • 2018-09-21
    • 2014-03-22
    • 2019-01-29
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多