2

How to fix or redesign results or create a TreeView after mapping the result using nodejs? this is my code, please check below the desired result

What I want here is that if the QuestionGroupID is existing it will not create another row but it will create array on optionItems

please see the desired result vs current result to understand what i mean

const getquestionnaire = await QuestionnaireModels.getQuestion(yearlevel, section);
const desiredResult = currentResult.map(({ yearlevel, section, Groupname, _id, QuestionDescription, OptionDescription }) => ({
   yearlevel,
   section,
   question: {
      Groupname,
      groupdetails: {
         QuestionGroupID,
         QuestionDescription,
         optionItems: {
            OptionDescription
         }
      }
   }
}))
res.send(getquestionnaire);

getQuestion

async getQuestion(yearlevel, section) {
    let student = await Database.getConnection().models.student;
    let qgroup = await Database.getConnection().models.questiongroups;
    let qdetails = await Database.getConnection().models.questiondetails;
    let oitem = await Database.getConnection().models.optionitems;
    student.hasMany(qgroup, { foreignKey: '_id'});
    student.hasMany(qdetails, {foreignKey: 'QuestionGroupID'});
    let question = await Database.getConnection().models.student.findAll({
     attributes:[
    'yearlevel','section','questiondetails.QuestionGroupID','questiongroups.GroupName','questiondetails.QuestionDescription','optionitems.OptionDescription'
    ],
      where: {
        yearlevel: yearlevel,
        section: section
      },
      include:[
        { model: qgroup, attribute:[] },
        { model: qdetails, attribute:[] },
    ],
      raw: true,
    })
    return result
  },
  let org_data = question.map(async data => {
        let item = await oitem.findAll({
            attributes: ['OptionDescription'],
            where: {QuestionDetailsID: data.QuestionGroupID},
            raw: true
        })
        
        return  item
    })

current result

[
    {
        "yearlevel": "Grade 7",
        "section": "Apple",
        "question":{
            "Groupname": "Third",
            "groupdetail":{
                "QuestionGroupID": 1,
                "QuestionDescription":"Eating Disorder",
                "optionItems":{
                    "OptionDescription": "Test 1"
                }
            }
        }
    },
    {
        "yearlevel": "Grade 7",
        "section": "Orange",
        "question":{
            "Groupname": "Third",
            "groupdetail":{
                "QuestionGroupID": 1,
                "QuestionDescription":"Eating Disorder",
                "optionItems":{
                    "OptionDescription": "Test 2"
                }
            }
        }
    },
    {
        "yearlevel": "Grade 8",
        "section": "Blue",
        "question":{
            "Groupname": "Test Group name",
            "groupdetail":{
                "QuestionGroupID": 2,
                "QuestionDescription":"Test Question",
                "optionItems":{
                    "OptionDescription": "Test"
                }
            }
        }
    }
]

desired result

[
    {
        "yearlevel": "Grade 7",
        "section": "Apple",
        "question":{
            "Groupname": "Third",
            "groupdetail":{
                "QuestionGroupID": 1,
                "QuestionDescription":"Eating Disorder",
                "optionItems":[
                    {
                        "OptionDescription": "Test 1"
                    },
                    {
                        "OptionDescription": "Test 2"
                    }
                ]
            }
        }
    },

    {
        "yearlevel": "Grade 8",
        "section": "Blue",
        "question":{
            "Groupname": "Test Group name",
            "groupdetail":{
                "QuestionGroupID": 2,
                "QuestionDescription":"Test Question",
                "optionItems":{
                    "OptionDescription": "Test"
                }
            }
        }
    }
]

this is related on this Nodejs how to create a `data tree` on result but different problem

dont mind this message dont mind this message dont mind this message dont mind this message dont mind this message dont mind this message dont mind this message dont mind this message dont mind this message

1 Answer 1

1

It's a simple case of "group array of objects by key using reduce". After we group by the QuestionGroupID, we take the values of that array and construct for each of grouped arrays the required item with the inner array of optionItems.

var input = [{yearlevel:"Grade 7",section:"Apple",question:{Groupname:"Third",groupdetail:{QuestionGroupID:1,QuestionDescription:"Eating Disorder",optionItems:{OptionDescription:"Test 1"}}}},{yearlevel:"Grade 7",section:"Orange",question:{Groupname:"Third",groupdetail:{QuestionGroupID:1,QuestionDescription:"Eating Disorder",optionItems:{OptionDescription:"Test 2"}}}},{yearlevel:"Grade 8",section:"Blue",question:{Groupname:"Test Group name",groupdetail:{QuestionGroupID:2,QuestionDescription:"Test Question",optionItems:{OptionDescription:"Test"}}}}];

var result = Object.values(input.reduce(function (agg, item) {
  agg[item.question.groupdetail.QuestionGroupID] ??= [];
  agg[item.question.groupdetail.QuestionGroupID].push(item)
  return agg;
}, {})).map(function(arr) {
  var result_item = arr[arr.length-1]
  var optionItems = arr.reduce(function(agg, item) {
    agg.push(item.question.groupdetail.optionItems)
    return agg;
  }, [])
  result_item.question.groupdetail.optionItems = optionItems;
  return result_item;
})

console.log(result)
.as-console-wrapper {
  max-height: 100% !important
}

Sign up to request clarification or add additional context in comments.

6 Comments

the array is optionItems not the groupdetail @IT goldman
I dont know why from this line i cant push agg[item.question.groupdetail.QuestionGroupID].push(item)
can you remake your code that the array is the optionitem not groupdetails
I just did I think
from agg[item.question.groupdetail.QuestionGroupID] ??= []; agg[item.question.groupdetail.QuestionGroupID].push(item) what does it mean?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.