Как получить / рассчитать сумму дочерних узлов для их родительского узла через jQuery или javascript - PullRequest
4 голосов
/ 06 августа 2020

Предположим, у меня есть данные в формате json , как это. это иерархические данные с родительскими дочерними отношениями.

{
  "data": [
    {
      "ID": "1",
      "AccountName": "a",
      "ParentID": "",
      "OpeningDebit": 0,
      "OpeningCredit": 0
    },
    {
      "ID": "2",
      "AccountName": "b",
      "ParentID": "1",
      "OpeningDebit": 0,
      "OpeningCredit": 0
    },
    {
      "ID": "3",
      "AccountName": "c",
      "ParentID": "2",
      "OpeningDebit": 100,
      "OpeningCredit": 200
    },
    {
      "ID": "4",
      "AccountName": "d",
      "ParentID": "2",
      "OpeningDebit": 50,
      "OpeningCredit": 10
    }
  ]
}

Родительские дочерние отношения, поддерживаемые свойствами ID и ParentID. Как и запись с ID 2, это дочерняя запись записи с ID 1.

Я хочу суммировать свойства OpeningDebit и OpeningCredit всех дочерних узлов и установить их для их родительского узел. Помните только узел, который Transactional (упомянутый в свойстве Type) имеет значения.

Результат моего желания:

{
  "data": [
    {
      "ID": "1",
      "AccountName": "a",
      "ParentID": "",
      "OpeningDebit": 150,
      "OpeningCredit": 210
    },
    {
      "ID": "2",
      "AccountName": "b",
      "ParentID": "1",
      "OpeningDebit": 150,
      "OpeningCredit": 210
    },
    {
      "ID": "3",
      "AccountName": "c",
      "ParentID": "2",
      "OpeningDebit": 100,
      "OpeningCredit": 200
    },
    {
      "ID": "4",
      "AccountName": "d",
      "ParentID": "2",
      "OpeningDebit": 50,
      "OpeningCredit": 10
    }
  ]
}

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

1 Ответ

3 голосов
/ 06 августа 2020

Создайте рекурсивную функцию, которая вычисляет сумму OpeningDebit и OpeningCredit, с базовым случаем, когда у данных нет дочерних элементов, возвращает собственное значение

Нижеприведенный фрагмент может помочь вам

const { data } = {
  data: [
    {
      ID: "1",
      AccountName: "a",
      ParentID: "",
      OpeningDebit: 0,
      OpeningCredit: 0,
    },
    {
      ID: "2",
      AccountName: "b",
      ParentID: "1",
      OpeningDebit: 0,
      OpeningCredit: 0,
    },
    {
      ID: "3",
      AccountName: "c",
      ParentID: "2",
      OpeningDebit: 100,
      OpeningCredit: 200,
    },
    {
      ID: "4",
      AccountName: "d",
      ParentID: "2",
      OpeningDebit: 50,
      OpeningCredit: 10,
    },
  ],
}

const res = data.map((d) => {
  const getSum = (obj, prop) => {
    const children = data.filter(({ ParentID }) => ParentID === obj.ID)
    if (children.length === 0) return obj[prop]
    return children.reduce((acc, c) => acc + getSum(c, prop), 0)
  }

  return {
    ...d,
    OpeningDebit: getSum(d, "OpeningDebit"),
    OpeningCredit: getSum(d, "OpeningCredit"),
  }
})

console.log({ data: res })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...