Преобразовать родительско-дочерние отношения иерархии в массив (дерево) - javascript или jquery

1

Изображение 174551

    var data = [
{
    "text": "BEHIND A COMMON MEAL: POLYPHENOLS IN FOOD ",
    "id": "445",
    "parentid": ""

},
{
    "text": "2.2 First Course: Pasta With Tomato Sauce (Polyphenols in Wheat Bran and Tomato Byproducts)",
    "id": "441",
    "parentid": "445"

},
{
    "text": "2.3 A Fresh Side Dish: Mixed Salad (Polyphenols From Fennel, Carrot)",
    "id": "442",
    "parentid": "445"

},
{
    "text": "hello mr.sujai",
    "id": "448",
    "parentid": "445"

},
{
    "text": "polyhierarchy",
    "id": "449",
    "parentid": "445"

},
{
    "text": "INTRODUCTION",
    "id": "452",
    "parentid": ""

},
{
    "text": "1.2 The Tight Biochemical Connection Between Vegetables and Their Byproducts",
    "id": "440",
    "parentid": "452"

},
{
    "text": "OTHER OFF-THE-MENU MISCELLANEOUS",
    "id": "454",
    "parentid": ""

},
{
    "text": "SOMETHING TO DRINK",
    "id": "456",
    "parentid": ""

},
{
    "text": "3.1 Orange Juice (Polyphenols From Orange Byproducts)",
    "id": "443",
    "parentid": "456"

},
{
    "text": "3.2 Wine (Polyphenols From Grape and Wine Byproducts)",
    "id": "444",
    "parentid": "456"

},
{
    "text": "understandings",
    "id": "451",
    "parentid": "456"

},
{
    "text": "Polyphenols",
    "id": "453",
    "parentid": "451"

},
{
    "text": "this is test",
    "id": "458",
    "parentid": "455"
},
{
    "text": "polyhierarchy",
    "id": "449",
    "parentid": "458"
},
{
    "text": "hello",
    "id": "447",
    "parentid": "449"
},
{
    "text": "hi",
    "id": "459",
    "parentid": "447"
},
{
    "text": "polyhierarchy",
    "id": "449",
    "parentid": "459"
},
{
    "text": "testing",
    "id": "457",
    "parentid": "458"
},
{
    "text": "hi test",
    "id": "450",
    "parentid": "457"
},
{
    "text": "speech",
    "id": "446",
    "parentid": "450"
}]

        function jsonTree() {

            // Keep a fast lookup dictionary
            var dictionary = {};
            for (var i = 0; i < data.length; i++) {
                dictionary[data[i].id] = data[i];
            }

            for (var i = 0; i < data.length; i++) {
                if (data[i].parentid == 449) {
                    var test = "";
                }
                if (data[i].parentid) {

                    var parent = dictionary[data[i].parentid];
                    arrData = parent;
                    if (parent) {
                        if (!parent.children) {
                            parent.children = [];
                        }
                        parent.children.push(data[i]);
                        //  arrData.children.push(data[i]);
                    }

                }
                }
                var arrData = [];
                for (var i = 0; i < data.length; i++) {
                    if (data[i].parentid == 455) {
                        arrData.push(data[i]);
                    }
                }
                document.getElementById("test").innerHTML = JSON.stringify(arrData);
                return false;
            }

полииерархический термин, имеющий другой родительский.

 for (var i = 0; i < data.length; i++) {
            dictionary[data[i].id] = data[i];
        }

в этом месте тот же идентификатор заменяется. polyhierarchy имеет id 449. При добавлении в словарь он заменяется.

Структура дерева должна быть
1. ПОСЛЕ ОБЩЕГО ПИТАНИЯ: ПОЛИФЕНОЛЫ В ПРОДУКТЕ
polyhierarchy
2. это тест
polyhierarchy
Привет
Привет
polyhierarchy

Мне нужен массив с родительскими, дочерними отношениями.

  • 0
    Подобный вопрос и возможное решение здесь stackoverflow.com/questions/32160294/…
  • 0
    Я хочу, чтобы иерархическая структура дерева.
Показать ещё 3 комментария
Теги:
tree
parent
parent-child

1 ответ

0

Есть несколько ошибок.

У вас есть дубликат идентификатора для вашего элемента polyhierarchie. Поскольку вы создаете словарь для поиска ваших идентификаторов, вы переписываете свой дочерний элемент вторым/последующим временем, когда вы добавляете его в свой объект.

{
    "text": "polyhierarchy",
    "id": "449", //<-- duplicate
    "parentid": "459"
}

У вас есть несуществующие parentIds.

{
    "text": "SOMETHING TO DRINK",
    "id": "456",
    "parentid": "455" // <--- doesn't exist

}

Из-за этих двух проблем код получил немного сложнее, чем ожидалось.

function mapData (data) {
    //build a dictionary for: id -> [eles]
    var map = data.reduce ((obj, ele) =>  { 
        obj[ele.id] = [ //let make the lookup an array, to support multiple elements with the same id
            ...obj[ele.id] || [], //keep the existing elements or initialize it to an array
            {...ele, children: []}
        ]; 

        return obj
     }, {});

    return Object.keys (map).reduce ((arr, key) => {
        let eles = map [key] || []; //process all elements

        eles.forEach (ele => {
            let parents = map [ele.parentid] || [];
            let parent  = parents [0]; 

            if (!parent) {
                parent = map [ele.parentid] = {children: [], root: true}
            } 

            parent.children.push (ele);

            if (parent.root && !~arr.indexOf (parent)) arr.push (parent);
        });
        return arr;
    },[])
}

console.log (mapData (data)) 
  • 0
    "parentid": "455" // <--- не существует. пожалуйста, примите во внимание, что он должен быть пустым или 0. Когда я копирую и вставляю код, он показывает ошибку на исходной странице. ошибка JavaScript пожалуйста, дайте исполняемый код JavaScript.
  • 0
    Пожалуйста, дайте исполняемый код
Показать ещё 2 комментария

Ещё вопросы

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