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

时间:2017-10-02 08:15:57

标签: javascript arrays

我有一个像这样的平面对象:

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

目标是根据group属性将此数组转换为嵌套数组。预期结果如下:

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

有没有一种简单的方法可以实现这一目标?

2 个答案:

答案 0 :(得分:2)

您可以使用嵌套哈希表的动态方法来嵌套项目级别。



lbrQty.Visible = false;
textQtyInput.Visible = false;

var data = [{ id: 0 }, { id: 1, group: "a" }, { id: 2, group: "a" }, { id: 3, group: "a/b" }, { id: 4 }, { id: 5, group: "a/b" }],
    result = [],
    hash = { _: result };

data.forEach(function (o) {
    if (!o.group) {
        hash._.push(o);
        return;
    }
    o.group.split('/').reduce(function (r, k) {
        if (!r[k]) {
            r[k] = { _: [] };
            r._.push(r[k]._);
        }
        return r[k];
    }, hash)._.push(o);
});

console.log(result);




答案 1 :(得分:1)

恕我直言,这有点令人费解。创建一个dict更容易,密钥是group的内容并使用它。

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

  1. 创建一个dict,其中键是group
  2. 的内容
  3. 订购密钥(例如按字母顺序排列)
  4. 每个键:
    1. 检查上一个密钥并查看它是否为分机(例如'a / b'与前一个密钥'a'相比'/ b'
    2. 如果您有扩展名,则按下堆栈上的键并在数组中创建嵌套级别
    3. 如果密钥没有扩展前一个密钥,则弹出,直到您获得扩展名或堆栈顶部
    4. 将您在第一步创建的字典中的所有元素添加到扩展名
  5. 这应该这样做。