2016-11-05 6 views
0

두 배열이 있습니다. 각 배열의 요소는 다음과 같습니다배열 요소의 순서 오류 발생

allLabBranches = [{ 
    "labbranchid": "1", 
    "labname": "Wahab Labs, Islampura Branch, Lahore", 
    "labtitle": "Wahab Labs Lahore", 
    "shortname": "WAHB", 
    "address": "56 Islampura, Lahore", 
    "landlineno": "04237940445", 
    "datecreated": "2016-03-11 11:00:00", 
    "createdbyname": "Jamshaid Sabir", 
    "createdbyuserid": "1", 
    "dateupdated": "2016-05-04 00:53:03", 
    "updatedbyname": "Jamshaid Sabir", 
    "updatedbyuserid": "1", 
    "clientgroups_clientgroupsid": "1", 
    "startdate": "2016-05-04" 
}, { 
    "labbranchid": "2", 
    "labname": "Wahab Labs, Model Town Branch, Lahore", 
    "labtitle": "Wahab Labs Lahore", 
    "shortname": "WAHAB", 
    "address": "45 Model Town, Lahore", 
    "landlineno": "04237945485", 
    "datecreated": "2016-03-11 11:00:00", 
    "createdbyname": "Jamshaid Sabir", 
    "createdbyuserid": "1", 
    "dateupdated": "0000-00-00 00:00:00", 
    "updatedbyname": "", 
    "updatedbyuserid": "", 
    "clientgroups_clientgroupsid": "1", 
    "startdate": "0000-00-00" 
}, { 
    "labbranchid": "3", 
    "labname": "Shahdara More Branch", 
    "labtitle": "Wahab Labs Lahore", 
    "shortname": "WAHAB", 
    "address": "Shahdara", 
    "landlineno": "04237933415", 
    "datecreated": "2016-03-11 11:48:15", 
    "createdbyname": "Jamshaid Sabir", 
    "createdbyuserid": "1", 
    "dateupdated": "0000-00-00 00:00:00", 
    "updatedbyname": "", 
    "updatedbyuserid": "", 
    "clientgroups_clientgroupsid": "1", 
    "startdate": "0000-00-00" 
}, { 
    "labbranchid": "4", 
    "labname": "New Branch", 
    "labtitle": "Wahab Labs Lahore", 
    "shortname": "WAHB", 
    "address": "More Samanabad, Lahore", 
    "landlineno": "042361561", 
    "datecreated": "2016-03-11 11:52:06", 
    "createdbyname": "Jamshaid Sabir", 
    "createdbyuserid": "1", 
    "dateupdated": "2016-03-14 15:06:44", 
    "updatedbyname": "Jamshaid Sabir", 
    "updatedbyuserid": "1", 
    "clientgroups_clientgroupsid": "1", 
    "startdate": "2016-03-14" 
}, { 
    "labbranchid": "5", 
    "labname": "Test Branch", 
    "labtitle": "xyz", 
    "shortname": "sfwe", 
    "address": "dsfasd", 
    "landlineno": "sdfasd", 
    "datecreated": "2016-03-12 00:14:11", 
    "createdbyname": "Jamshaid Sabir", 
    "createdbyuserid": "1", 
    "dateupdated": "2016-08-11 12:54:12", 
    "updatedbyname": "Jamshaid Sabir", 
    "updatedbyuserid": "1", 
    "clientgroups_clientgroupsid": "1", 
    "startdate": "2016-03-12" 
}, { 
    "labbranchid": "6", 
    "labname": "Test Branch 2", 
    "labtitle": "asdfs", 
    "shortname": "asdfs", 
    "address": "asdf", 
    "landlineno": "asdf", 
    "datecreated": "2016-03-12 12:16:24", 
    "createdbyname": "Jamshaid Sabir", 
    "createdbyuserid": "1", 
    "dateupdated": "0000-00-00 00:00:00", 
    "updatedbyname": "", 
    "updatedbyuserid": "", 
    "clientgroups_clientgroupsid": "1", 
    "startdate": "2016-03-12" 
}, { 
    "labbranchid": "7", 
    "labname": "Wahab Labs, Shahdara Branch, Lahore", 
    "labtitle": "Shahdara", 
    "shortname": "Shahdara", 
    "address": "Shahdara", 
    "landlineno": "0423744915", 
    "datecreated": "2016-08-11 12:56:27", 
    "createdbyname": "Jamshaid Sabir", 
    "createdbyuserid": "1", 
    "dateupdated": "2016-08-11 12:57:01", 
    "updatedbyname": "Jamshaid Sabir", 
    "updatedbyuserid": "1", 
    "clientgroups_clientgroupsid": "1", 
    "startdate": "2016-08-01" 
}] 

또 다른 배열 요소는 다음과 같습니다

labsOfUser = [{ 
    "userhasbranchid": "53", 
    "labbranches_labbranchid": "6", 
    "usersoflabs_userId": "9" 
}, { 
    "userhasbranchid": "54", 
    "labbranches_labbranchid": "1", 
    "usersoflabs_userId": "9" 
}, { 
    "userhasbranchid": "55", 
    "labbranches_labbranchid": "7", 
    "usersoflabs_userId": "9" 
}, { 
    "userhasbranchid": "56", 
    "labbranches_labbranchid": "2", 
    "usersoflabs_userId": "9" 
}] 

지금 내가 선택 여러 상자가 선택된 일부는 같은 선택하지 나는 몇 가지를 보여줍니다. 아래의 코드 주어진다

function populateSelectedLabs() { 

    $('#labbranchids').empty(); 
    if (allLabBranches.length >= labsOfUser.length) { 
     for (var i = 0; i < allLabBranches.length; i++) { 
     for (var j = 0; j < labsOfUser.length; j++) { 
      if (allLabBranches[i].labbranchid == labsOfUser[j].labbranches_labbranchid) { 

      $("#labbranchids").append("<option selected='selected' value='" + allLabBranches[i].labbranchid + "'>" + allLabBranches[i].labname + "</option>"); 
      allLabBranches = jQuery.grep(allLabBranches, function(value) { 
       return value != allLabBranches[i]; 
      }); 
      } //end inner if   

     } //end inner loop 
     } //end outer loop 
    } //end if 
    for (var i = 0; i < allLabBranches.length; i++) { 
     $("#labbranchids").append("<option value='" + allLabBranches[i].labbranchid + "'>" + allLabBranches[i].labname + "</option>"); 
    } //end for loop 


    } //end function 

문제는 배열 요소 비교 어레이에 존재하지만, 다른 배열의 인덱스에있는 요소를 그리워이다. 다음 코드 줄에서 오류가 발생합니다.

if(allLabBranches[i].labbranchid == labsOfUser[j].labbranches_labbranchid){ 

두 배열의 모든 요소를 ​​비교하는 방법을 알려주시겠습니까?

+1

을 당신은 루프 – adeneo

+0

안에'allLabBranches'을 수정하고 예. 선택한 것으로 표시 될 항목을 제거합니다. –

+0

그리고 루프 내부의 배열을 제거하면 카운트가 엉망이됩니다. – adeneo

답변

1

특정 항목이 일치하지 않는 이유는 동일 배열의 루프 내부에 allLabBranches을 재정의하여 더 짧게 만드는 것입니다.

는 다음에 해당하는 변경하기 전에의 그런 가정하자 :이 평등 외부 루프의 다음 반복에서, 나중에 검출 기대

labsOfUser[j-1].labbranches_labbranchid == allLabBranches[i+1].labbranchid 

. 그러나 allLabBranches으로 재 할당 되었기 때문에이 값은 더 이상 색인 i+1에 없지만 i에 있습니다. 이 값은 (일치하는 값이 j-1이므로) 내부 루프의 나머지 부분에서 더 이상 일치하지 않으므로 i은 외부 루프의 다음 반복에 대해 증가합니다. 따라서이 값은 절대로 일치하지 않습니다.

allLabBranches 배열을 거꾸로 반복하면서이 문제를 해결할 수 있지만 labsOfUser 배열의 값으로 해시를 생성하는 것이 좋습니다. 그러면 성능이 향상됩니다.

이 좋아하는 작업을 수행 할 수 있습니다 대상 브라우저 ES6을 지원하는 경우

function populateSelectedLabs() { 
    $('#labbranchids').empty(); 
    // create hash 
    var hash = {}; 
    for (var j = 0; j < labsOfUser.length; j++) { 
     hash[labsOfUser[j].labbranches_labbranchid] = 1; 
    } 
    allLabBranches = jQuery.grep(allLabBranches, function(value) { 
     return hash[value.labbranchid]; 
    }).concat(jQuery.grep(allLabBranches, function(value) { 
     return !hash[value.labbranchid]; 
    })); 

    for (var i = 0; i < allLabBranches.length; i++) { 
     $("#labbranchids").append($('<option>') 
      .val(allLabBranches[i].labbranchid) 
      .text(allLabBranches[i].labname) 
      .attr('selected', hash[allLabBranches[i].labbranchid])); 
    } 
} 

, 당신은 이런 식으로 쓸 수 :

function populateSelectedLabs() { 
    $('#labbranchids').empty(); 
    var hash = new Set(labsOfUser.map(value => value.labbranches_labbranchid)); 
    allLabBranches.filter(value => hash.has(value.labbranchid)) 
     .concat(allLabBranches.filter(value => !hash.has(value.labbranchid))) 
     .forEach(value => 
      $("#labbranchids").append($('<option>') 
       .val(value.labbranchid) 
       .text(value.labname) 
       .attr('selected', hash.has(value.labbranchid))) 
     ); 
} 
+0

위의 코드는 어떤 실험실이 선택되었는지, 어떤 실험실이 아닌지 보여줍니다 . 선택한 실험실을 추가하는 코드 줄을 놓쳤을 수 있습니다. 감사. –

+0

실제로 수정되었습니다. – trincot