Code States에서 진행하는 Daily Coding 24번을 풀다가 발견한 사실이 있다.
const isSubsetOf=function(base,sample){
// ToDo:아래에 코드를 작성하시오.
}
처음에는 두 배열을 오름차순으로 정렬한 뒤, filter
를 통해 요소를 비교하여 두 배열이 같은지 확인한다. 같으면 true
, 다르면 false
를 반환하려 했다.
const isSubsetOf = function (base, sample) {
// TODO: 여기에 코드를 작성합니다.
// 우선 두 배열을 정렬한다.
base.sort(function(a, b) {
return a - b;
});
sample.sort(function(a,b){
return a - b;
})
// base와 sample이 같은 요소가 존재하면, 그 요소를 result에 담아준다.
// 없는 경우 중복되는 요소가 없으므로, 계속 return하다가 끝난다.
// 최종 result와 sample의 크기를 비교한다.
let i=0;
const result=base.filter(number=>{
if(number===sample[i]){
i++;
return number;
}else return;
})
return result===sample;
};
배열 result
와 sample
은 동일한 요소를, 동일한 순서대로 가지고 있지만, false
를 반환하는 것이였다.
기존 문법에서 기초적인 사실을 까먹고 있었다.
JavaScript에서는 두 개의 배열이 동일한 요소를, 동일한 순서대로 가지고 있어도 다른 배열로 인식한다. 이유는 배열과 객체는 값을 비교하지 않고, 그 주소를 비교하기 때문이다.
이러한 이유로 원하는 답이 나오지 않았고, 다른 방법을 찾기 시작했다.
JSON.stringify()
메서드는 JavaScript 값이나 객체를 JSON 문자열로 변환한다.
따라서 배열을 비교할 때, 요소 하나씩 다 비교할 필요가 없다.
const isSubsetOf = function (base, sample) {
// TODO: 여기에 코드를 작성합니다.
// 우선 두 배열을 정렬한다.
base.sort(function(a, b) {
return a - b;
});
sample.sort(function(a,b){
return a - b;
})
// base와 sample이 같은 요소가 존재하면, 그 요소를 result에 담아준다.
// 없는 경우 중복되는 요소가 없으므로, 계속 return하다가 끝난다.
// 최종 result와 sample의 크기를 비교한다.
let i=0;
const result=base.filter(number=>{
if(number===sample[i]){
i++;
return number;
}else return;
})
return JSON.stringify(result)===JSON.stringify(sample);
};