2016-09-21 1 views

답변

2

뭔가 다음과 같이

var students = []; 

function addStudent(student) { 
    // Check if we already know about this student. 
    var existingRecord = students.find(function (s) { 
    return s.student_id === student.student_id; 
    }); 

    var classInfo = { 
    class_number: student.class_number, 
    location: student.location 
    }; 

    if (!existingRecord) { 
    // This is the first record for this student so we construct 
    // the complete record and add it. 
    students.push({ 
     student_id: student.student_id, 
     classes: [classInfo] 
    }); 

    return; 
    } 

    // Add to the existing student's classes. 
    existingRecord.classes.push(classInfo); 
} 

당신은 다음을 호출하는 것입니다 : here 사용할 수

addStudent({ 
    "student_id": "67890", 
    "class_number": "abcd", 
    "location": "below", 
}); 

의 Runnable JSBin 예.

자세한 내용은 Array.prototype.findat MDN입니다.

+0

'student' 객체 하나를 사용하여 성공적으로 추가 할 수 있었지만 동일한 'student_id' 두 개의'student' 객체를 추가하려고하면 첫 번째'classInfo' 객체가 제대로 추가되었습니다 두 번째'classInfo' 객체가 올바른 위치에 추가되었지만 그 안에'student_id'가 추가되었습니다. 문제의 원인은 어디입니까? 로그 테스트를 시도했지만 찾을 수 없습니다. 다시 한번 감사드립니다. jabclab –

+0

이전 댓글을 무시하십시오. 내 실수 였어. 정말 고맙습니다! 답변을 수락하고 upvoted. 그러나 학습 목적을 위해'students.find (function (s)) '은 무엇을하고 있습니까? –

+0

@JoKo 도움이 되셨습니다 :-)'Array.prototype.find'에 대한 자세한 내용은 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find에서 확인하실 수 있습니다. – jabclab

1

이 문제는 student_id에 의한 색인 생성을 사용하여 해결할 수 있습니다. 예를 들어 :

var sourceArray = [{...}, {...}, ...]; 

var result = {}; 

sourceArray.forEach(function(student){ 

    var classInfo = { 
     class_number: student.class_number, 
     location : student.location 
    }; 

    if(result[student.student_id]){ 

     result[student.student_id].classes.push(classInfo); 

    } else { 

     result[student.student_id] = { 
      student_id : student.student_id, 
      classes  : [classInfo] 
     } 

    } 
}); 


// Strip keys: convert to plain array 

var resultArray = []; 

for (key in result) { 
    resultArray.push(result[key]); 
} 

는 또한 student_id 또는 일반 배열 resultArray에 의해 색인 오브젝트를 포함 result 형식을 사용할 수 있습니다.

+0

이전 답변이 적용되었습니다. 관계없이 upvoted;) –

+0

감사. 예, 이전 답변은 find()와 같은 메서드를 사용하지 않기 때문에 코드가 더 빨라졌습니다. 이것은 대형 배열에 특히 중요합니다. – IStranger