Javascript 根据组属性将对象的平面数组转换为嵌套数组

Javascript 根据组属性将对象的平面数组转换为嵌套数组,javascript,arrays,Javascript,Arrays,我有一个平面的对象数组,如下所示: [ { id: 0 }, { id: 1, group: "a" }, { id: 2, group: "a" }, { id: 3, group: "a/b" }, { id: 4 }, { id: 5, group: "a/b" }, ] [ { id: 0 }, [ { id: 1, group: "a" }, { id: 2, group: "a" } [

我有一个平面的对象数组,如下所示:

[
   { id: 0 },
   { id: 1, group: "a" },
   { id: 2, group: "a" },
   { id: 3, group: "a/b" },
   { id: 4 },
   { id: 5, group: "a/b" },
]
[
   { id: 0 },
   [
      { id: 1, group: "a" },
      { id: 2, group: "a" }
      [
         { id: 3, group: "a/b" },
         { id: 5, group: "a/b" }
      ],       
   ],
   { id: 4 },
]
目标是基于组属性将此数组转换为嵌套数组。预期结果如下所示:

[
   { id: 0 },
   { id: 1, group: "a" },
   { id: 2, group: "a" },
   { id: 3, group: "a/b" },
   { id: 4 },
   { id: 5, group: "a/b" },
]
[
   { id: 0 },
   [
      { id: 1, group: "a" },
      { id: 2, group: "a" }
      [
         { id: 3, group: "a/b" },
         { id: 5, group: "a/b" }
      ],       
   ],
   { id: 4 },
]

有没有一个简单的方法可以做到这一点呢?

我觉得这有点复杂。创建以
组的内容为键的dict并使用它更容易

如果你不必特别高效,我会:

  • 创建一个dict,其中键是
    组的内容
  • 按字母顺序排列钥匙(例如,按字母顺序排列)
  • 对于每个键:
  • 检查上一个键并查看它是否是扩展名(例如,“a/b”与上一个键“a”相比有“/b”)
  • 如果有扩展名,则按下堆栈上的键并在数组中创建嵌套级别
  • 否则,如果该键没有扩展上一个键,则弹出该键,直到获得扩展名或堆栈顶部
  • 将第一步创建的dict中的所有元素添加到扩展中

  • 这样就可以了。

    我觉得这有点复杂。创建一个dict,其中键是
    组的内容,并使用它更容易

    如果你不需要特别高效,我会:

  • 创建一个dict,其中键是
    组的内容
  • 按字母顺序排列钥匙(例如,按字母顺序排列)
  • 对于每个键:
  • 检查上一个键并查看它是否是扩展名(例如,“a/b”与上一个键“a”相比有“/b”)
  • 如果有扩展名,则按下堆栈上的键并在数组中创建嵌套级别
  • 否则,如果该键没有扩展上一个键,则弹出该键,直到获得扩展名或堆栈顶部
  • 将第一步创建的dict中的所有元素添加到扩展中

  • 这应该可以做到。

    您可以使用动态方法,为嵌套级别的项使用嵌套哈希表

    var data=[{id:0},{id:1,组:“a”},{id:2,组:“a”},{id:3,组:“a/b”},{id:4},{id:5,组:“a/b”},
    结果=[],
    散列={{u0:result};
    data.forEach(函数(o){
    if(!o.group){
    哈希推送(o);
    返回;
    }
    o、 group.split(“/”).reduce(函数(r,k){
    如果(!r[k]){
    r[k]={{}:[]};
    r、 推力(r[k];
    }
    返回r[k];
    },hash。)推送(o);
    });
    console.log(结果);

    。作为控制台包装{max height:100%!important;top:0;}
    您可以使用动态方法,为嵌套级别的项使用嵌套哈希表

    var data=[{id:0},{id:1,组:“a”},{id:2,组:“a”},{id:3,组:“a/b”},{id:4},{id:5,组:“a/b”},
    结果=[],
    散列={{u0:result};
    data.forEach(函数(o){
    if(!o.group){
    哈希推送(o);
    返回;
    }
    o、 group.split(“/”).reduce(函数(r,k){
    如果(!r[k]){
    r[k]={{}:[]};
    r、 推力(r[k];
    }
    返回r[k];
    },hash。)推送(o);
    });
    console.log(结果);

    .as控制台包装{最大高度:100%!重要;顶部:0;}
    什么表示要使用哪个父级?这是一种奇怪的输出格式,因为您实际上需要解析
    内容,并且项目没有排序,所以在嵌套之前,您需要对元素进行迭代和排序。@NinaScholz,基本上子数组应该出现在该特定组的第一个元素所在的位置是在原始数组中定义的。不确定这是否有意义。可能我没有充分考虑;)什么表示要使用哪个父级?这是一种奇怪的输出格式,因为您实际上需要解析
    内容,并且项目没有排序,所以在嵌套之前,您需要迭代并对元素进行排序。@NinaScholz,基本上子数组应该出现在该特定组的第一个元素被取消排序的位置在原始阵列中被罚款。不确定这是否有意义。也许我没有充分考虑;)谢谢,效率不是这里的问题。实际阵列非常小。谢谢,效率不是问题。实际阵列非常小。