var data1 = [{'id': '1', 'val': 'test'}, {'id': '2', 'val': 'test'}, {'id': '3', 'val': 'test'}]; 
var data2 = [{'id': '1', 'val': 'test'}, {'id': '2', 'val': 'test'}, {'id': '4', 'val': 'test'}]; 
 

 

data1 배열 과 data2 배열을 비교하여

특정한 키 (여기서는 id) 의 값 (여기서는 1,2,3,4)을 참고하여


data1에 있으나 data2에 없는 {'id': '3', 'val': 'test'} 만 남도록
data2에 있으나 data1에 없는 {'id': '4', 'val': 'test'} 만 남도록 처리 하려면 어떻게 하면 될까요?
(예시를 위한 결과이며 위 중복체크 과정에서는 val 키와 값은 전혀 무관, 오롯이 id키의 값만 기준)

 

 

 

 

아래는 기존의 소스 입니다. (키없이 값만 존재하는 배열에서는 작동 됨)

var data1 = new Array("1","2","3"); 
var data2 = new Array("1","2","4");


var result1 = data1.filter(function(val) { 
      return data2.indexOf(val) == -1; 
    }); 
console.log(result1); // 3 출력


var result2 = data2.filter(function(val) { 
      return data1.indexOf(val) == -1; 
    }); 
console.log(result2); // 4 출력

 

위와 같이 작동되도록

특정한 키의 값이 동일한지 여부를 체크하고 중복안되는 대상만을 남기는 방법은 무엇일까요?

 

고수분 도와주세요! ㅠㅠ

  • profile
    var result1 = data1.filter(function(val) {
    for(var key in data2) {
    if(val.id == data2[key].id) return false;
    }
    return true;
    });

    해당하는 요소(val)의 id를 가지는 요소가 data2 요소들 중에 존재하는지 체크후 존재하면 false를, 존재하지 않으면 true를 반환하면 됩니다. 반대로 하신다면 data2.filter에 for문에서 비교하는건 data1을 하시면 되겠죠.
  • profile profile
    답변 감사드립니다 :)
    특정한 함수를 써야되는줄 알았는데 필터단에서 반복문으로 처리하는 방법이 있었군요!
  • ?

     

    var data1 = [{'id': '1', 'val': 'test'}, {'id': '2', 'val': 'test'}, {'id': '3', 'val': 'test'}];
    var data2 = [{'id': '1', 'val': 'test'}, {'id': '2', 'val': 'test'}, {'id': '4', 'val': 'test'}];
    
    var result1 = data1.filter(function(each1) {
        return data2.every(function(each2){
            return each1.id !== each2.id;
        });
    });
    
    // result1 [{id: "3", val: "test"}]

     

  • ? profile
    답변 감사합니다 :)
    덕분에 많이 배워갑니다.
  • ?

    몇개 안되면 상관없는데 갯수가 많을 경우엔 소트하고서 순서대로 비교하는게 압도적으로 빨라집니다

    그냥 풀로 첨부터 끝까지 비교하면 버블 소트보다도 느린...

  • ? profile
    비교대상 개수가 많다면 그럴수도 있겠군요!!
    보통 10개~20개 정도의 값만 비교하는데 사용하려구 합니다!