배열 탐색하기
indexOf, lastIndexOf와 includes
arr.indexOf(item, from)는 인덱스 from부터 시작해 item(요소)을 찾습니다. 요소를 발견하면 해당 요소의 인덱스를 반환하고, 발견하지 못했으면 -1을 반환한다.
arr.lastIndexOf(item, from)는 위 메서드와 동일한 기능을 하는데, 검색을 끝에서부터 시작한다는 점만 다르다.
arr.includes(item, from)는 인덱스 from부터 시작해 item이 있는지를 검색하는데, 해당하는 요소를 발견하면 true를 반환한다.
let arr = [1, 0, false];
alert( arr.indexOf(0) ); // 1
alert( arr.indexOf(false) ); // 2
alert( arr.indexOf(null) ); // -1
alert( arr.includes(1) ); // true
find와 findIndex
객체로 이루어진 배열에서, 특정 조건에 부합하는 객체를 배열 내에서 어떻게 찾을 수 있을까?
let result = arr.find(function(item, index, array) {
// true가 반환되면 반복이 멈추고 해당 요소를 반환합니다.
// 조건에 해당하는 요소가 없으면 undefined를 반환합니다.
});
item – 함수를 호출할 요소
index – 요소의 인덱스
array – 배열 자기 자신
id와 name 프로퍼티를 가진 사용자 객체로 구성된 배열을 예로 들어보자. 배열 내에서 id == 1 조건을 충족하는 사용자 객체를 찾아보자.
let users = [
{id: 1, name: "John"},
{id: 2, name: "Pete"},
{id: 3, name: "Mary"}
];
let user = users.find(item => item.id == 1);
alert(user.name); // John
filter
조건을 충족하는 요소가 여러 개라면 arr.filter(fn)를 사용하면 된다.
let results = arr.filter(function(item, index, array) {
// 조건을 충족하는 요소는 results에 순차적으로 더해진다.
// 조건을 충족하는 요소가 하나도 없으면 빈 배열이 반환된다.
});
예시
let users = [
{id: 1, name: "John"},
{id: 2, name: "Pete"},
{id: 3, name: "Mary"}
];
// 앞쪽 사용자 두 명을 반환합니다.
let someUsers = users.filter(item => item.id < 3);
alert(someUsers.length); // 2