아래와 같이 두개의 배열이 있을 때, 두 배열에 모두 존재하는 객체를 찾아 반환해야 하는 코드를 짜야 했었다.
const a = [
{name: "jake", age: "11", school: "tes"},
{name: "luna", age: "13", school: "tes"},
{name: "leo", age: "7", school: "sin"}
];
const b = [
{name: "jake", age: "11", school: "tes", add: "13st"},
{name: "luna", age: "15", school: "tes", location: "downtown"},
{name: "leo", age: "7", school: "sing", city: "london"}
];
반복문을 돌면서 같은 객체를 찾을 수는 있지만 만약에 배열이 더 커진다면, 배열의 모든 요소를 하나씩 접근하며 확인하는 반복문은 적합하지 않을 것이다.
그래서 사용하는게 바로 Array.prototype.some() 이다.
[some 함수]
some()함수는 배열에서 조건을 하나라도 만족하는 요소가 있으면 true를 반환하는 고차함수이다. 콜백 함수를 인자로 받고 이 함수가 true를 반환하는 첫번째 요소를 찾으면 즉시 멈추고 true 를 반환하게 된다.
간단한 예제를 보면 num => num > 3 이라는 콜백함수를 인자로 받았다.
const arr = [1, 2, 3, 4];
// 배열에 3보다 큰 값이 있나?
console.log(arr.some(num => num > 3)); // true
[적용하기]
그렇다면 아까 위에 있는 a 함수와 b 함수를 비교하는 코드를 보자
// 비교에 사용할 키 목록: 각 객체에서 'name'과 'age' 속성을 기준으로 비교함
const matchEle = ["name", "age"];
// 두 객체의 특정 key들의 값이 모두 일치하는지 확인하는 함수
const allEleMatched = (obj1, obj2, keys) =>
keys.every(key => obj1[key] === obj2[key]);
// 배열 a 안의 요소 중에서, 배열 b 안의 요소와 matchEle 기준으로 일치하는 것이 하나라도 있는지 확인
// 일치하는 객체가 하나라도 있으면 true 반환
const matchingObject = a.some(objA =>
b.some(objB => allEleMatched(objA, objB, matchEle))
);
// 배열 a 안에서, 배열 b의 어떤 객체와 matchEle 기준으로 일치하는 객체만 필터링하여 추출
// 결과는 배열 형태로 반환됨
const matches = a.filter(objA =>
b.some(objB => allEleMatched(objA, objB, matchEle))
);
console.log(matches);
// [{name: "jake", age: "11", school: "tes"},
// {name: "leo", age: "7", school: "sin"}]
//만약에 배열이 아닌 일치하는 객체의 특정 요소만 뺴오고 싶다면
//map으로 뽑아내면 ["jake", "leo"]
const matchedNames = a
.filter(objA => b.some(objB => allEleMatched(objA, objB, matchEle)))
.map(obj => obj.name);
'Front > javascript' 카테고리의 다른 글
| [Javascript] 마우스 휠을 통해서 가로 드래그 하기 (2) | 2024.12.25 |
|---|---|
| [Javascript] 클릭해서 드래그로 가로 스크롤 구현 하기 (click and drag) (0) | 2024.12.23 |
| [Javascript] scrollHeight 와 clientHeight 에 대해 알아보자 (3) | 2024.11.11 |
| 재귀함수를 코드에 적용해보자 (1) | 2024.11.08 |
| setInterval 을 알아보자 (0) | 2024.10.29 |