Как сгруппировать каждый уровень данных JSON по одному из его общих значений

1

Я столкнулся с некоторыми проблемами в отношении моего проекта, где я пытаюсь построить дерево, используя данные JSON. У меня есть что-то вроде этого

var treeData = [
          {
            "name": "Root Node",
            "parent": "null",
            "children": [
              {
                "name": " Transport",
                "parent": "Root Node",
                "nodeId":"nod411",
                "children": [
                      {
                        "name": "Cars",
                        "parent": "Transport",
                        "nodeId":"nodjz13l"
                      },
                      {
                        "name": "Transport-2",
                        "parent": "Transport",
                        "nodeId":"nod411",
                        "children": [

                          {
                            "name": "Cars",
                            "parent": "Transport-2",
                            "nodeId":"nod1_cdot"
                          },
                          {
                            "name": "Cars",
                            "parent": "Transport-2",
                            "nodeId":"nod45jkl"
                          },
                          {
                            "name": "Bikes",
                            "parent": "Transport-2",
                            "nodeId":"nod411"
                          },
                          {
                            "name": "Cars",
                            "parent": "Transport-2",
                            "nodeId":"nod961"
                          },
                          {
                            "name": "Cars",
                            "parent": "Transport-2",
                            "nodeId":"nodm2m40"
                          },
                          {
                            "name": "Bikes",
                            "parent": "Transport-2",
                            "nodeId":"nod411"
                          },
                     ]
                  },
                  {
                    "name": "Cars",
                    "parent": "Transport",
                    "nodeId":"nod411"
                  },

                  {
                    "name": "Cars",
                    "parent": "Transport",
                    "nodeId":"nod311"
                  },
                  {
                    "name": "Bikes",
                    "parent": "Transport",
                    "nodeId":"nod411"
                  },
            ]
          },
          {
            "name": "Bikes",
            "parent": "Root Node",
            "nodeId":"nod411"
          }

        ]
      }
    ];

где я хочу группировать аналогичные записи, основываясь на его значении как пары ключ-значение, что-то вроде этого.

var treeData = [
          {
            "name": "Root Node",
            "parent": "null",
            "children": [
              {
                "name": " Transport",
                "parent": "Root Node",
                "nodeId":"nod411",
                "children": [
                    {"key":"car","values":[
                      {
                        "name": "Cars",
                        "parent": "Transport",
                        "nodeId":"nodjz13l"
                      },
                      {
                        "name": "Cars",
                        "parent": "Transport",
                        "nodeId":"nod411"
                      },

                      {
                        "name": "Cars",
                        "parent": "Transport",
                        "nodeId":"nod311"
                      }
                     ]
                    },
                  {
                    "name": "Transport-2",
                    "parent": "Transport",
                    "nodeId":"nod411",
                    "children": [
                        {"key":"car","values":[
                              {
                                "name": "Cars",
                                "parent": "Transport-2",
                                "nodeId":"nod1_cdot"
                              },
                              {
                                "name": "Cars",
                                "parent": "Transport-2",
                                "nodeId":"nod45jkl"
                              },
                              {
                                "name": "Cars",
                                "parent": "Transport-2",
                                "nodeId":"nod961"
                              },
                              {
                                "name": "Cars",
                                "parent": "Transport-2",
                                "nodeId":"nodm2m40"
                              }
                           ]
                        },
                        {"key":"Bikes","values":[
                              {
                                "name": "Bikes",
                                "parent": "Transport-2",
                                "nodeId":"nod411"
                              },
                              {
                                "name": "Bikes",
                                "parent": "Transport-2",
                                "nodeId":"nod411"
                              }
                            ]
                        }
                     ]
                  },
                  {"key":"Bikes","values":[
                  {
                    "name": "Bikes",
                    "parent": "Transport",
                    "nodeId":"nod411"
                  }
                ]
               }
            ]
          },
          {
            "name": "Bikes",
            "parent": "Root Node",
            "nodeId":"nod411"
          }

        ]
      }
    ];

Я хочу группировать данные на каждом уровне дерева.

Я пробовал вложенность с помощью d3 как

var treeDataByName = d3.nest()
        .key(function(d) { return d.name; })
        .entries(treeData);
console.log(JSON.stringify(treeDataByName));

Однако он преобразует только корневой узел в пару значений ключа.

Любые предложения будут полезны. Спасибо

  • 3
    Опубликованный вопрос, по-видимому, не включает каких-либо попыток решить проблему. StackOverflow ожидает, что вы сначала попытаетесь решить собственную проблему , поскольку ваши попытки помогают нам лучше понять, что вы хотите. Пожалуйста, отредактируйте вопрос, чтобы показать, что вы пробовали, чтобы проиллюстрировать конкретную проблему, которую вы испытываете в минимальном воспроизводимом примере . Для получения дополнительной информации см. Как спросить и взять тур .
  • 0
    как насчет первого и второго уровня? Вам нужна группировка по имени?
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Вы можете группировать каждый массив по желаемому ключу с помощью итеративного (для фактического массива) и рекурсивного (с детьми) подхода.

function groupBy(array, key) {
    return array.reduce((r, o) => {
        var temp = r.find(g => g.key === o[key]),
            value = Object.assign({}, o, o.children && { children: groupBy(o.children, key) });

        if (temp) {
            temp.values.push(value);
        } else {
            r.push({ key: o[key], values: [value] });
        }
        return r;
    }, []);
}

var tree = [{ name: "Root Node", parent: "null", children: [{ name: " Transport", parent: "Root Node", nodeId: "nod411", children: [{ name: "Cars", parent: "Transport", nodeId: "nodjz13l" }, { name: "Transport-2", parent: "Transport", nodeId: "nod411", children: [{ name: "Cars", parent: "Transport-2", nodeId: "nod1_cdot" }, { name: "Cars", parent: "Transport-2", nodeId: "nod45jkl" }, { name: "Bikes", parent: "Transport-2", nodeId: "nod411" }, { name: "Cars", parent: "Transport-2", nodeId: "nod961" }, { name: "Cars", parent: "Transport-2", nodeId: "nodm2m40" }, { name: "Bikes", parent: "Transport-2", nodeId: "nod411" }] }, { name: "Cars", parent: "Transport", nodeId: "nod411" }, { name: "Cars", parent: "Transport", nodeId: "nod311" }, { name: "Bikes", parent: "Transport", nodeId: "nod411" }] }, { name: "Bikes", parent: "Root Node", nodeId: "nod411" }] }],
    result = groupBy(tree, 'name');

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
  • 0
    Большое спасибо за вашу помощь @ Нина, она отлично работала, как моя потребность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню