简体   繁体   English

使用lodash或for循环对json对象进行分组

[英]Group json object either using lodash or for loop

so i have this array : 所以我有这个数组:

[
  {
    corequisite: "",
    curriculumYr: "2017-2018",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "GMRC 101||Math 101"
    semester: "1st Term",
    year: "1st Year",
    subjectCode : "ENG 101",
    units : "9"
  },
  {
    corequisite: "SOFTENG1||SOFTENG2",
    curriculumYr: "2017-2018",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "COMP 1"
    semester: "1st Term",
    year: "1st Year",
    subjectCode : "THESIS101",
    units : "9"
  },
  {
    corequisite: "",
    curriculumYr: "2017-2018",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "Sample1||Sample2"
    semester: "2nd Term",
    year: "1st Year",
    subjectCode : "SampleSubj101",
    units : "9"
  },
  {
    corequisite: "",
    curriculumYr: "2017-2018",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "SSSS4||S6"
    semester: "1st Term",
    year: "2nd Year",
    subjectCode : "S1",
    units : "9"
  },
  {
    corequisite: "SSS2||SSS4",
    curriculumYr: "2017-2018",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "COMP 1"
    semester: "2nd Term",
    year: "2nd Year",
    subjectCode : "S2",
    units : "9"
  },
  {
    corequisite: "",
    curriculumYr: "2017-2018",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "SS1||SS2"
    semester: "1st Term",
    year: "2nd Year",
    subjectCode : "S3",
    units : "9"
  }
],
[
  {
    corequisite: "",
    curriculumYr: "2018-2019",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "GMRC 101||Math 101"
    semester: "1st Term",
    year: "1st Year",
    subjectCode : "ENG 101",
    units : "9"
  },
  {
    corequisite: "SOFTENG1||SOFTENG2",
    curriculumYr: "2018-2019",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "COMP 1"
    semester: "1st Term",
    year: "1st Year",
    subjectCode : "THESIS101",
    units : "9"
  },
  {
    corequisite: "",
    curriculumYr: "2018-2019",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "Sample1||Sample2"
    semester: "2nd Term",
    year: "1st Year",
    subjectCode : "SampleSubj101",
    units : "9"
  },
  {
    corequisite: "",
    curriculumYr: "2018-2019",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "SSSS4||S6"
    semester: "1st Term",
    year: "2nd Year",
    subjectCode : "S1",
    units : "9"
  },
  {
    corequisite: "SSS2||SSS4",
    curriculumYr: "2018-2019",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "COMP 1"
    semester: "2nd Term",
    year: "2nd Year",
    subjectCode : "S2",
    units : "9"
  },
  {
    corequisite: "",
    curriculumYr: "2018-2019",
    programCode: "ET"
    majorCode: "AET",
    prerequisites: "SS1||SS2"
    semester: "1st Term",
    year: "2nd Year",
    subjectCode : "S3",
    units : "9"
  }
]

i wanted to group this by programCode,curriculumYear and majorCode and then with the grouped output group it again by Semester and Year 我想将其按majorCode programCode,curriculumYearmajorCode分组,然后将分组的输出再次按SemesterYear分组

i also wanted to make an array of the prerequisite and corequisite by splitting the subjects with delimiter || 我还想通过用定界符||分割主题来构成prerequisitecorequisite prerequisite的数组。

here is an example output / desired output: 这是示例输出/所需的输出:

  [
      curriculumYr: '2017-2018',
      programCode: 'ET',
      majorCode: 'ATO'
      ,{ Sem: [
              subjects : [{
                             Corequisites: ['Subj1','Subj2'],
                             Prequisites: [],
                             subjectCode: "Sample1"
                           },
                           {
                             Corequisites: ['Subj1','Subj2'],
                             Prequisites: [],
                             subjectCode: "Sample1"                       
                           }],
              term: "1st Term"
            }],
            [{ 
               subjects: [2nd term subjects here], 
               term: "2nd Term" 
            }]
       Year: "1st Year"
   }],
    [
      curriculumYr: '2018-2019',
      programCode: 'ET',
      majorCode: 'ATO'
      ,{ Sem: [
              subjects : [{
                             Corequisites: ['Subj1','Subj2'],
                             Prequisites: [],
                             subjectCode: "Sample1"
                           },
                           {
                             Corequisites: ['Subj1','Subj2'],
                             Prequisites: [],
                             subjectCode: "Sample1"                       
                           }],
              term: "1st Term"
            }],
            [{ 
               subjects: [2nd term subjects here], 
               term: "2nd Term" 
            }]
       Year: "1st Year"
   }]

Same as for the 2nd Year's 1st and 2nd Terms format 2nd Year's 1st and 2nd Terms format

I tried using angular-filter and lodash but i get different results. 我尝试使用angular-filter和lodash,但是得到了不同的结果。 Way to different :D 通往不同的方式:D

Thank you so much for the help! 非常感谢你的帮助!

With plain javascript, you could use a function for converting, renaming and grouping the data into a new nested array. 使用普通的javascript,您可以使用函数将数据转换,重命名和分组为新的嵌套数组。

The function makes use of a hash table for each nested level and iterates the given keys as grouping property and add on every stage a new array for the result set. 该函数对每个嵌套级别使用哈希表,并将给定的键作为分组属性进行迭代,并在每个阶段为结果集添加新数组。

 function getGrouped(array, keys, callback, children) { var result = [], hash = { _: result }; callback = callback || function (o) { return o; }; children = children || []; array.forEach(function (a) { keys.reduce(function (r, k, i) { var temp = {}, key = a[k], target = k; if (Array.isArray(k)) { key = k.map(function (b) { return a[b]; }).join('|'); } else if (typeof k === 'object') { key = a[Object.keys(k)[0]]; target = k[Object.keys(k)[0]]; } if (!r[key]) { r[key] = { _: [] }; if (Array.isArray(k)) { k.forEach(function (b) { temp[b] = a[b]; }); } else { temp[target] = key; } temp[children[i] || 'children'] = r[key]._; r._.push(temp); } return r[key]; }, hash)._.push(callback(a)); }); return result; } var data = [{ corequisite: "", curriculumYr: "2017-2018", programCode: "ET", majorCode: "AET", prerequisites: "GMRC 101||Math 101", semester: "1st Term", year: "1st Year", subjectCode: "ENG 101", units: "9" }, { corequisite: "SOFTENG1||SOFTENG2", curriculumYr: "2017-2018", programCode: "ET", majorCode: "AET", prerequisites: "COMP 1", semester: "1st Term", year: "1st Year", subjectCode: "THESIS101", units: "9" }, { corequisite: "", curriculumYr: "2017-2019", programCode: "ET", majorCode: "AET", prerequisites: "Sample1||Sample2", semester: "2nd Term", year: "1st Year", subjectCode: "SampleSubj101", units: "9" }, { corequisite: "", curriculumYr: "2017-2019", programCode: "ET", majorCode: "AET", prerequisites: "SSSS4||S6", semester: "1st Term", year: "2nd Year", subjectCode: "S1", units: "9" }, { corequisite: "SSS2||SSS4", curriculumYr: "2017-2018", programCode: "ET", majorCode: "AET", prerequisites: "COMP 1", semester: "2nd Term", year: "2nd Year", subjectCode: "S2", units: "9" }, { corequisite: "", curriculumYr: "2017-2018", programCode: "ET", majorCode: "AET", prerequisites: "SS1||SS2", semester: "1st Term", year: "2nd Year", subjectCode: "S3", units: "9" }], callback = function (o) { return { Corequisites: o.corequisite ? o.corequisite.split('||') : [], Prequisites: o.prerequisites ? o.prerequisites.split('||') : [], subjectCode: o.subjectCode }; }, result1 = getGrouped(data, [{ year: 'Year' }, { semester: 'term' }], callback, ['Sem', 'subjects']), result2 = getGrouped(data, [['curriculumYr', 'programCode', 'majorCode'], { semester: 'term' }], callback, ['Sem', 'subjects']); console.log(result1); console.log(result2); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM