자바스크립트(jquery) 2개 배열의 특정 키:값 비교 방법 질문합니다 ㅠㅠ
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.3 |
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 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 출력
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 출력
위와 같이 작동되도록
특정한 키의 값이 동일한지 여부를 체크하고 중복안되는 대상만을 남기는 방법은 무엇일까요?
고수분 도와주세요! ㅠㅠ
댓글 6
for(var key in data2) {
if(val.id == data2[key].id) return false;
}
return true;
});
해당하는 요소(val)의 id를 가지는 요소가 data2 요소들 중에 존재하는지 체크후 존재하면 false를, 존재하지 않으면 true를 반환하면 됩니다. 반대로 하신다면 data2.filter에 for문에서 비교하는건 data1을 하시면 되겠죠.
특정한 함수를 써야되는줄 알았는데 필터단에서 반복문으로 처리하는 방법이 있었군요!
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"}]
덕분에 많이 배워갑니다.
몇개 안되면 상관없는데 갯수가 많을 경우엔 소트하고서 순서대로 비교하는게 압도적으로 빨라집니다
그냥 풀로 첨부터 끝까지 비교하면 버블 소트보다도 느린...
보통 10개~20개 정도의 값만 비교하는데 사용하려구 합니다!