2017-04-01 104 views
2

我能够编写解决方案,但我想知道是否有更优雅和高效的方法来完成此任务。在JSON中合并项目

var arr = []; 

//I have a array like this: 
    arr = [{ 
     teacherid: 10, 
     teacherName: 'andy', 
     age: 30, 
     studentid: 1, 
     studentName: 'A', 
     studentAge: 10 
     }, 
     { 
     teacherid: 10, 
     teacherName: 'andy', 
     age: 30, 
     studentid: 2, 
     studentName: 'B', 
     studentAge: 11 
     }, { 
     teacherid: 10, 
     teacherName: 'andy', 
     age: 30, 
     studentid: 3, 
     studentName: 'C', 
     studentAge: 12 
     }, 

     { 
     teacherid: 11, 
     teacherName: 'May', 
     age: 40, 
     studentid: 4, 
     studentName: 'D', 
     studentAge: 9 
     }, { 
     teacherid: 11, 
     teacherName: 'May', 
     age: 40, 
     studentid: 5, 
     studentName: 'E', 
     studentAge: 12 
     } 
    ]; 


//want to group the students info in each indiviual teacher like this: 
//* 
    [{ 
     "teacherid": 10, 
     "teacherName": "andy", 
     "age": 30, 
     "studentArr": [{ 
     "studentid": 1, 
     "studentName": "A", 
     "studentAge": 10 
     }, { 
     "studentid": 2, 
     "studentName": "B", 
     "studentAge": 11 
     }, { 
     "studentid": 3, 
     "studentName": "C", 
     "studentAge": 12 
     }] 
    }, { 
     "teacherid": 11, 
     "teacherName": "May", 
     "age": 40, 
     "studentArr": [{ 
     "studentid": 4, 
     "studentName": "D", 
     "studentAge": 9 
     }, { 
     "studentid": 5, 
     "studentName": "E", 
     "studentAge": 12 
     }] 
    } 
    }] 
*// 



//my solution 
    var result = []; 
    var first = true; 
    arr = _.sortBy(arr, 'teacherid'); 


    (function() { 
     for (var i = 0; i < arr.length; i++) { 
     for (var j = i; j < arr.length; j++) { 
      console.log("comparing i:" + i + " with j:" + j); 

      if (i === j && j === arr.length) { 
      console.log("exit " + i + " : " + j) 
      return; 
      } else if (arr[i].teacherid === arr[j].teacherid) { 
      if (first) { 
       result.push({ 
       teacherid: arr[j].teacherid, 
       teacherName: arr[j].teacherName, 
       age: arr[j].age, 
       studentArr: [{ 
        studentid: arr[j].studentid, 
        studentName: arr[j].studentName, 
        studentAge: arr[j].studentAge 
       }] 
       }) 
      } else { 
       //find in result arr, the obj that contain this teacher and push the student in the array 
       var teacher = _.find(result, function(item) { 
       return (item.teacherid === arr[j].teacherid) 
       }) 
       teacher.studentArr.push({ 
       studentid: arr[j].studentid, 
       studentName: arr[j].studentName, 
       studentAge: arr[j].studentAge 
       }) 
      } 
      first = false; 

      } else { 
      first = true; 
      i = j - 1; 
      j = arr.length; //end inner loop, go back to outer loop and check next teacherID 
      } 
     } 
     } 

    })() 


    console.log(JSON.stringify(result)); 

如果其他程序员读它,这将是一个头痛的问题。我想知道是否有比这更好的解决方案(更高效和/或更可读)。我觉得像我穷举被迫在

+0

你用什么代码?如果我们不知道您尝试过什么,很难提供建议。 –

+2

什么?该代码在我的帖子中是正确的。整个解决方案 – user308553

回答

3

你可以使用一个截流用哈希表为老师。

var array = [{ teacherid: 10, teacherName: 'andy', age: 30, studentid: 1, studentName: 'A', studentAge: 10 }, { teacherid: 10, teacherName: 'andy', age: 30, studentid: 2, studentName: 'B', studentAge: 11 }, { teacherid: 10, teacherName: 'andy', age: 30, studentid: 3, studentName: 'C', studentAge: 12 }, { teacherid: 11, teacherName: 'May', age: 40, studentid: 4, studentName: 'D', studentAge: 9 }, { teacherid: 11, teacherName: 'May', age: 40, studentid: 5, studentName: 'E', studentAge: 12 }], 
 
    grouped = array.reduce(function (hash) { 
 
     return function (r, a) { 
 
      if (!hash[a.teacherid]) { 
 
       hash[a.teacherid] = { 
 
        teacherid: a.teacherid, 
 
        teacherName: a.teacherName, 
 
        studentArr: [] 
 
       }; 
 
       r.push(hash[a.teacherid]); 
 
      } 
 
      hash[a.teacherid].studentArr.push({ 
 
       studentid: a.studentid, 
 
       studentName: a.studentName, 
 
       studentAge: a.studentAge 
 
      }); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0
function group(data, column) { 
    var generatedData = {}; 
    $.each(data, function(i, dt) { 
    var key = dt[column]; 
    if (!(key in generatedData)) { 
     generatedData[key] = []; 
    } 
    generatedData[key].push(dt); 
    }); 
    return generatedData; 
} 

var g = group([ 
{ 
     teacherid: 10, 
     teacherName: 'andy', 
     age: 30, 
     studentid: 1, 
     studentName: 'A', 
     studentAge: 10 
     }, 
     { 
     teacherid: 10, 
     teacherName: 'andy', 
     age: 30, 
     studentid: 2, 
     studentName: 'B', 
     studentAge: 11 
     }, { 
     teacherid: 10, 
     teacherName: 'andy', 
     age: 30, 
     studentid: 3, 
     studentName: 'C', 
     studentAge: 12 
     }, 

     { 
     teacherid: 11, 
     teacherName: 'May', 
     age: 40, 
     studentid: 4, 
     studentName: 'D', 
     studentAge: 9 
     }, { 
     teacherid: 11, 
     teacherName: 'May', 
     age: 40, 
     studentid: 5, 
     studentName: 'E', 
     studentAge: 12 
     } 
], 'teacherid'); 

document.write(JSON.stringify(g)); 
+0

这不会产生我用作示例的结果数组。这只是分组他们 – user308553