根据 javascript 中的键值对数组项进行分组

Group array items based on a key's value in javascript

我有一个数据数组如下

const data = [
            {
                "SurveyGroupID": 28,
                "SurveyGroupTypeID": 4,
                "SurveyID": 23,
                "SurveyGroupSequence": 1,
                "SurveyQuestionSequence": 1,
                "Question": "What is your reason for visiting our practice?",
                "DataTypeName": "Memo",
                "DataTypeID": 4,
                "Required": true
            },
            {
                "SurveyGroupID": 28,
                "SurveyGroupTypeID": 4,
                "SurveyID": 23,
                "SurveyGroupSequence": 2,
                "SurveyQuestionSequence": 2,
                "Question": "What is your height?",
                "DataTypeName": "String",
                "DataTypeID": 2,
                "Required": true
            },
            {
                "SurveyGroupID": 28,
                "SurveyGroupTypeID": 4,
                "SurveyID": 23,
                "SurveyGroupSequence": 1,
                "SurveyQuestionSequence": 3,
                "Question": "What is your weight?",
                "DataTypeName": "Integer",
                "DataTypeID": 3,
                "Required": true
            },
]

我需要group the array based on a key's value。那就是我需要将数组项组合到具有相同 SurveyGroupSequence

fields

导致

[
  {
    "fields": [
      {
        "SurveyGroupTypeID": "1",
        "Question": "What is your reason for visiting our practice?"
      },
      {
        "SurveyGroupTypeID": "1",
        "Question": "What is your weight?"
      }
    ]
  },
  {
    "fields": [
      {
        "SurveyGroupTypeID": "2",
        "Question": "What is your height?"
      }
    ]
  }
]

我怎样才能做到这一点?谢谢。

我试过的

    const ar1 = [];
    data.forEach((Element, index) => {
      const fields = [{
        "SurveyGroupTypeID": Element.SurveyGroupTypeID,
        "Question": Element.Question
      }]
      ar1.push({
        fields : fields
      })
    })

使用对象映射通过键 SurveyGroupSequence 收集为 SurveyGroupTypeID:

function groupByID(data){
  console.log(
    Object.values(data.reduce((acc,{SurveyGroupSequence: SurveyGroupTypeID, Question})=>{
        if( acc[SurveyGroupTypeID] )
          acc[SurveyGroupTypeID].push({SurveyGroupTypeID, Question})
        else
          acc[SurveyGroupTypeID] = [{SurveyGroupTypeID, Question}]
        return acc;
    },{}))
  )
}


const data = [
            {
                "SurveyGroupID": 28,
                "SurveyGroupTypeID": 4,
                "SurveyID": 23,
                "SurveyGroupSequence": 1,
                "SurveyQuestionSequence": 1,
                "Question": "What is your reason for visiting our practice?",
                "DataTypeName": "Memo",
                "DataTypeID": 4,
                "Required": true
            },
            {
                "SurveyGroupID": 28,
                "SurveyGroupTypeID": 4,
                "SurveyID": 23,
                "SurveyGroupSequence": 2,
                "SurveyQuestionSequence": 2,
                "Question": "What is your height?",
                "DataTypeName": "String",
                "DataTypeID": 2,
                "Required": true
            },
            {
                "SurveyGroupID": 28,
                "SurveyGroupTypeID": 4,
                "SurveyID": 23,
                "SurveyGroupSequence": 1,
                "SurveyQuestionSequence": 3,
                "Question": "What is your weight?",
                "DataTypeName": "Integer",
                "DataTypeID": 3,
                "Required": true
            },
]
groupByID(data)

你可以这样做

const surveyGroupTypeMap = {};

data.forEach(({SurveyGroupTypeID, Question}) => {
    if (surveyGroupTypeMap[SurveyGroupTypeID]) {
        surveyGroupTypeMap[SurveyGroupTypeID].push(Question);
    } else {
        surveyGroupTypeMap[SurveyGroupTypeID] = [Question];
    }
});

const result = [];

Object.keys(surveyGroupTypeMap).forEach(id => {
    result.push({
        fields: surveyGroupTypeMap[id].map(question => ({
            SurveyGroupTypeID: id, Question: question
        }))
    });
});

console.log(result);