Заполнить массив результатов по значениям в дочерних елементах

Есть исходный массив данных на JS

    const dataArr = [
      { kekv: 3000, dtZf: 0, dtSf: 0, ktZf: 0, ktSf: 0 },
    
      { kekv: 3100, dtZf: 0, dtSf: 0, ktZf: 0, ktSf: 0 },
    
      { kekv: 3110, dtZf: 0, dtSf: 0, ktZf: 0, ktSf: 0 },
      { kekv: 3120, dtZf: 0, dtSf: 0, ktZf: 0, ktSf: 0 },
      { kekv: 3130, dtZf: 0, dtSf: 0, ktZf: 0, ktSf: 0 },
    
      { kekv: 3111, dtZf: 30, dtSf: 60, ktZf: 0, ktSf: 70 },
      { kekv: 3112, dtZf: 80, dtSf: 50, ktZf: 40, ktSf: 0 },
    
      { kekv: 3121, dtZf: 90, dtSf: 20, ktZf: 30, ktSf: 20 },
      { kekv: 3122, dtZf: 10, dtSf: 10, ktZf: 10, ktSf: 50 },
    
      { kekv: 3131, dtZf: 20, dtSf: 20, ktZf: 20, ktSf: 10 }
]

Есть массив соотношений родительских и дочерних елементов, которые формируют массив данных

const kekvArr = [
  {code: "3000", id: 30, parentID: null, treePatch: ['30']},   

  {code: "3100", id: 31, parentID: 30, treePatch: ['30','31']},     

  {code: "3110", id: 311, parentID: 31, treePatch: ['30','31', '311']},    
  {code: "3120", id: 312, parentID: 31, treePatch: ['30','31', '312']},    
  {code: "3130", id: 313, parentID: 31, treePatch: ['30','31', '312']},    

  {code: "3111", id: 3111, parentID: 311, treePatch: ['30','31', '311', '3111']},  
  {code: "3112", id: 3112, parentID: 311, treePatch: ['30','31', '311', '3112']},  

  {code: "3121", id: 3121, parentID: 312, treePatch: ['30','31', '312', '3121']},  
  {code: "3122", id: 3122, parentID: 312, treePatch: ['30','31', '312', '3122']},  

  {code: "3131", id: 3131, parentID: 313, treePatch: ['30','31', '313', '3131']}  
]

Нужно в исходном массиве посчитать значения dtZf, dtSf, ktZf, ktSf всех родителей по их дочерним елементам.


Ответы (1 шт):

Автор решения: Alexey

Предлагаю такой вариант решения:

const code = kekvArr.map(i => i.code).reverse()
    code.map(_code => {
      const childData = dataArr.find(d => d.kekv == _code)
      const parId = kekvArr.find(e => e.code == _code).parentID
      if (parId != null) {
        const parCode = kekvArr.find(c => c.id == parId).code
        const parData = dataArr.find(d => d.kekv == parCode)
        parData.dtZf += childData.dtZf
        parData.dtSf += childData.dtSf
        parData.ktZf += childData.ktZf
        parData.ktSf += childData.ktSf
      } 
    })
    
    console.log(dataArr)

Может есть более универсальное и оптимальное решение ? Заранее благодарен!

→ Ссылка