Преобразование плоского массива в древовидную структуру с javascript - PullRequest
0 голосов
/ 19 апреля 2020

У меня проблема с преобразованием плоского массива, и я могу использовать вашу помощь!

В настоящее время формат данных выглядит следующим образом:

    [
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": null,
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 1,
            "OVERALL_MARKET_VALUE": 8
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
            "MARKET_VALUE": 10,
            "OVERALL_MARKET_VALUE": 5
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
            "MARKET_VALUE": 5,
            "OVERALL_MARKET_VALUE": 3
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 5,
            "OVERALL_MARKET_VALUE": 10
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
            "MARKET_VALUE": 10,
            "OVERALL_MARKET_VALUE": 5
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": null,
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 1,
            "OVERALL_MARKET_VALUE": 8
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
            "MARKET_VALUE": 10,
            "OVERALL_MARKET_VALUE": 5
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
            "MARKET_VALUE": 5,
            "OVERALL_MARKET_VALUE": 3
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 5,
            "OVERALL_MARKET_VALUE": 10
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
            "MARKET_VALUE": 10,
            "OVERALL_MARKET_VALUE": 5
        }
    ]

И я надеюсь закончить с результат, подобный этому:

    [
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": null,
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1,
            "children": [
                {
                    "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                    "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                    "TERTIARY_ACCOUNT_NAME": null,
                    "MARKET_VALUE": 1,
                    "OVERALL_MARKET_VALUE": 8,
                    "children": [
                        {
                            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
                            "MARKET_VALUE": 10,
                            "OVERALL_MARKET_VALUE": 5
                        },
                        {
                            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
                            "MARKET_VALUE": 5,
                            "OVERALL_MARKET_VALUE": 3
                        },
                    ]
                },
                {
                    "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                    "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                    "TERTIARY_ACCOUNT_NAME": null,
                    "MARKET_VALUE": 5,
                    "OVERALL_MARKET_VALUE": 10,
                    "children": [
                        {
                            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
                            "MARKET_VALUE": 6,
                            "OVERALL_MARKET_VALUE": 1
                        },
                        {
                            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
                            "MARKET_VALUE": 10,
                            "OVERALL_MARKET_VALUE": 5
                        },
                    ]
                },
            ]
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": null,
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1,
            "children": [
                {
                    "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                    "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                    "TERTIARY_ACCOUNT_NAME": null,
                    "MARKET_VALUE": 1,
                    "OVERALL_MARKET_VALUE": 8,
                    "children": [
                        {
                            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
                            "MARKET_VALUE": 10,
                            "OVERALL_MARKET_VALUE": 5
                        },
                        {
                            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
                            "MARKET_VALUE": 5,
                            "OVERALL_MARKET_VALUE": 3
                        },
                    ]
                },
                {
                    "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                    "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                    "TERTIARY_ACCOUNT_NAME": null,
                    "MARKET_VALUE": 5,
                    "OVERALL_MARKET_VALUE": 10,
                    "children": [
                        {
                            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
                            "MARKET_VALUE": 6,
                            "OVERALL_MARKET_VALUE": 5
                        },
                        {
                            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
                            "MARKET_VALUE": 10,
                            "OVERALL_MARKET_VALUE": 5
                        },
                    ]
                },
            ]
        },
    ]

Извините за огромный размер! Раздел верхнего уровня будет MASTER_ACCOUNT_NAME, уровень после этого будет SUB_ACCOUNT_NAME, а элементы самого низкого уровня - TERTIARY_ACCOUNT_NAME.

Я делал многочисленные попытки сделать это с loda sh и vanilla javascript, но мне пришлось признают, что манипулирование данными на самом деле не моя область мастерства, и я тяжело бороться с этим!

заранее спасибо за любую помощь вы можете предоставить мне! * * 1013

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Как насчет использования javascript и лямбд для манипулирования вашим массивом? Примерно так:

const yourArray = [....];
const result = yourArray.filter(obj => obj['SUB_ACCOUNT_NAME'] == null);
result.forEach(node => node["CHILDRENS"] = yourArray.filter(obj => obj['SUB_ACCOUNT_NAME'] != null && obj['TERTIARY_ACCOUNT_NAME'] == null && obj["MASTER_ACCOUNT_NAME"] == node["MASTER_ACCOUNT_NAME"]));

Это создает двухуровневую структуру ... теперь, чтобы сгенерировать третий, вам нужно будет сделать что-то похожее для каждого узла второго уровня ... это можно обобщить с помощью функции. что-то вроде этого:

function putChildrenFromArray(nodes, elements, howToSelectSons) {
  nodes.forEach(node => node["CHILDRENS"] = elements.filter(obj => howToSelectSons(obj, node)));
}

вызывая его так:

putChildrenFromArray(result, yourArray, (obj, father) => obj['SUB_ACCOUNT_NAME'] != null && obj['TERTIARY_ACCOUNT_NAME'] == null && obj["MASTER_ACCOUNT_NAME"] == father["MASTER_ACCOUNT_NAME"])

, и вы можете назвать его один для второго уровня ... затем один раз для каждого узла первого уровня, передавая его дочерние элементы и, конечно же, изменение лямбда-функции, используемой для выбора сыновей.

Вы должны изменить минимальное количество вещей между двумя лямбдами ... и вы можете обобщить их еще больше, если у вас будет еще больше уровней.

0 голосов
/ 19 апреля 2020

Вы можете комбинировать метод reduce с while l oop и массивом для хранения значений на разных уровнях, которые будут отображаться из другого объекта levels.

const data = [{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":null,"TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":6,"OVERALL_MARKET_VALUE":1},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":1,"OVERALL_MARKET_VALUE":8},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_1","MARKET_VALUE":10,"OVERALL_MARKET_VALUE":5},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_2","MARKET_VALUE":5,"OVERALL_MARKET_VALUE":3},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":5,"OVERALL_MARKET_VALUE":10},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_1","MARKET_VALUE":6,"OVERALL_MARKET_VALUE":1},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_2","MARKET_VALUE":10,"OVERALL_MARKET_VALUE":5},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":null,"TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":6,"OVERALL_MARKET_VALUE":1},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":1,"OVERALL_MARKET_VALUE":8},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_1","MARKET_VALUE":10,"OVERALL_MARKET_VALUE":5},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_2","MARKET_VALUE":5,"OVERALL_MARKET_VALUE":3},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":5,"OVERALL_MARKET_VALUE":10},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_1","MARKET_VALUE":6,"OVERALL_MARKET_VALUE":1},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_2","MARKET_VALUE":10,"OVERALL_MARKET_VALUE":5}]

const result = []
const levels = [
  'MASTER_ACCOUNT_NAME',
  'SUB_ACCOUNT_NAME',
  'TERTIARY_ACCOUNT_NAME'
]

data.reduce((r, e) => {
  let value = { ...e, children: [] }
  let level = levels.length

  while (level--) {
    if (e[levels[level]]) {
      r[level + 1] = value.children
      r[level].push(value)
      break
    }
  }

  return r;
}, [result])

console.log(result)
0 голосов
/ 19 апреля 2020

Это решение указано c для ваших примеров данных, и вам может потребоваться настроить его, если у вас есть другая форма данных.

Тем не менее, если вам нравится элемент 1000, не рекомендуется.

function makeTree(data) {
  return data
    .filter(
      (masterItem) =>
        masterItem.SUB_ACCOUNT_NAME === null &&
        masterItem.TERTIARY_ACCOUNT_NAME === null
    )
    .map((masterItem) => ({
      ...masterItem,
      children: data
        .filter(
          (subItem) =>
            subItem.MASTER_ACCOUNT_NAME === masterItem.MASTER_ACCOUNT_NAME &&
            subItem.SUB_ACCOUNT_NAME !== null &&
            subItem.TERTIARY_ACCOUNT_NAME === null
        )
        .map((subItem) => ({
          ...subItem,
          children: data.filter(
            (tertiaryItem) =>
              tertiaryItem.SUB_ACCOUNT_NAME === subItem.SUB_ACCOUNT_NAME &&
              tertiaryItem.TERTIARY_ACCOUNT_NAME !== null
          ),
        })),
    }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...