본문 바로가기

JavaScript

[Deep dive] 27장 배열(2)

27.8 배열 메서드 

 

- Array 생성자 함수는 정적 메서드를 제공하며, 배열 객체의 프로토타입인 Array.prototype은 프로토타입 메서드를 제공

- 원본 배열을 직접 변경하는 메서드 (mutator method)

- 원본 배열을 직접 변경하지 않고 새로운 배열을 생성하여 반환하는 메서드 (accessor method)

 

27.8.1 Array.isArray

- Array 생성자 함수의 정적 메서드 

- 전달한 인수가 배열이면 true, 배열이 아니면 false 반환

 

27.8.2 Array.prototype.indexOf

- 원본 배열에서 인수로 전달된 요소를 검색하여 인덱스 반환

- 중복되는 요소가 여러 개 있다면 첫 번째로 검색된 요소의 인덱스 반환

- 요소가 존재하지 않으면 -1 반환

- 배열에 특정 요소가 존재하는지 확인할 떄 유용

const foods = ['apple','banana','orange'];

//foods 배열에 'orange' 요소가 존재하는지 확인 
if(foods.indexOf('orange') === -1) {
  //foods 배열에 'orange'요소가 존재하지 않으면 'orange' 요소를 추가 
  foods.push('orange');
}

console.log(foods);  //[ 'apple', 'banana', 'orange' ]

 

27.8.3 Array.prototype.push

- 인수로 전달받은 모든 값을 원본 배열의 마지막 요소로 추가

- 변경된 length 프로퍼티 값을 반환 

- 원본 배열을 직접 변경

const arr = [1,2];

//인수로 전달받은 모든 값을 원본 배열 arr의 마지막 요소로 추가하고 변경된 length 값을 반환
let result = arr.push(3,4);
console.log(result); //4

//push 메서드는 원본 배열을 직접 변경
console.log(arr); //[ 1, 2, 3, 4 ]

 

27.8.4 Array.prototype.pop

- 원본 배열에서 마지막 요소를 제거하고 제거한 요소를 반환 

- 원본 배열이 빈 배열이면 undefined 반환

- 원본 배열을 직접 변경

const arr = [1,2];

//원본 배열에서 마지막 요소를 제거하고 제거한 요소를 반환
let result = arr.pop();
console.log(result); //2

//pop 메서드는 원본 배열을 직접 변경
console.log(arr); //[ 1 ]

 

27.8.5 Array.prototype.unshift

- 인수로 전달받은 모든 값을 원본 배열의 선두에 요소로 추가

- 변경된 length 프로퍼티 값을 반환

- 원본 배열을 직접 변경

const arr = [1,2];

//인수로 전달받은 모든 값을 원본 배열의 선두에 요소로 추가하고 변경된 length 값 반환
let result = arr.unshift(3,4);
console.log(result); //4

//원본 배열을 직접 변경
console.log(arr); //[ 3, 4, 1, 2 ]

 

25.8.6 Array.prototype.shift

- 원본 배열에서 첫 번째 요소를 제거하고 제거한 요소를 반환 

- 원본 배열이 빈 배열이면 undefined 반환

- 원본 배열을 직접 변경

const arr = [1,2];

//원본 배열에서 첫 번째 요소를 제거하고 제거한 요소를 반환
let result = arr.shift();
console.log(result); //1

//원본 배열을 직접 변경
console.log(arr); //[ 2 ]

 

25.8.7 Arrray.prototype.concat

- 인수로 전달된 값들을 원본 배열의 마지막 요소로 추가한 새로운 배열을 반환

- 인수로 전달한 값이 배열인 경우 배열을 해체하여 새로운 배열의 요소로 추가 

const arr1 = [1,2];
const arr2 = [3,4];

//배열 arr2를 원본 배열 arr1의 마지막 요소로 추가한 새로운 배열을 반환
let result = arr1.concat(arr2);
console.log(result); //[ 1, 2, 3, 4 ]

//숫자를 원본 배열 arr1의 마지막 요소로 추가한 새로운 배열을 반환
result = arr1.concat(3);
console.log(result); //[ 1, 2, 3 ]

//배열 arr2와 숫자를 원본 배열 arr1의 마지막 요소로 추가한 새로운 배열을 반환
result = arr1.concat(arr2,5);
console.log(result); //[ 1, 2, 3, 4, 5 ]

//원본 배열은 변경되지 않음
console.log(arr1); //[ 1, 2 ]

 

27.8.8 Array.prototype.splice

- 원본 배열의 중간에 요소를 추가하거나 중간에 있는 요소를 제거하는 경우 사용 

- 원본 배열을 직접 변경

 

- 3개의 매개변수 

 1) start : 원본 배열의요소를 제거하기 시작할 인덱스 

 2) deleteCount : 제거할 요소의 개수 

 3) items : 제거한 위치에 삽입할 요소들의 목록

const arr = [1,2,3,4];

//원본 배열의 인덱스 1부터 2개의 요소를 제거하고 그 자리에 새로운 요소 20,30을 삽입
const result = arr.splice(1,2,20,30);

//제거한 요소가 배열로 반환
console.log(result); //[ 2, 3 ]

//원본 배열을 직접 변경
console.log(arr); //[ 1, 20, 30, 4 ]

- 제거할 요소의 개수를 생략하면 첫 번째 인수로 전달된 시작 인덱스부터 모든 요소 제거 

const arr = [1,2,3,4];

//원본 배열의 인덱스 1부터 모든 요소 제거 
const result = arr.splice(1);

//원본 배열이 변경
console.log(arr); //[ 1 ]
//제거한 요소가 배열로 반환
console.log(result); //[ 2, 3, 4 ]

- 배열에서 특정 요소를 제거하려면 indexOf 메서드를 통해 특정 요소의 인덱스를 취득한 다음 splice 메서드 사용 

const arr =[1,2,3,1,2];

//배열 array에서 item 요소 제거 
//item 요소가 여러 개 존재하면 첫 번째 요소만 제거 
function remove(array,item) {
  //제거할 item 요소의 인덱스 취득
  const index = array.indexOf(item);

  //제거할 item 요소가 있다면 제거 
  if(index !== -1) array.splice(index,1);

  return array;
}

console.log(remove(arr,2)); //[ 1, 3, 1, 2 ]
console.log(remove(arr,10)); //[ 1, 3, 1, 2 ]

 

27.8.9 Array.prototype.slice

- 인수로 전달된 범위의 요소들을 복사하여 배열로 반환

- 원본 배열은 변경되지 않음

 

- 2개의 매개변수 

 1) start : 복사를 시작할 인덱스 

 2) end : 복사를 종료할 인덱스 

 

- 두번째 인수(end)를 생략하면 첫 번째 인수 (start)로 전달받은 인덱스부터 모든 요소를 복사하여 배열로 반환

- 인수를 모두 생략하면 원본 배열의 복사본을 생성하여 반환

 -> 얕은 복사(shallow copy)를 통해 생성

const arr = [1,2,3];

//arr[0]부터 arr[1] 이전까지 복사하여 반환
arr.slice(0,1); 
//arr[1]부터 arr[2] 이전까지 복사하여 반환
arr.slice(1,2); 

//원본은 변경되지 않음
console.log(arr); //[ 1, 2, 3 ]

//인수를 모두 생략하면 원본 배열의 복사본을 생성(얕은 복사)
const copy = arr.slice();
console.log(copy); //[ 1, 2, 3 ]
console.log(copy === arr); //false

- slice 메서드가 복사본을 생성하는 것을 이용하여 유사배열객체를 배열로 변환 가능

function sum() {
  //유사배열객체를 배열로 변환
  var arr = Array.prototype.slice.call(arguments);
  console.log(arr); //[ 1, 2, 3 ]

  return arr.reduce(function(pre,cur) {
    return pre + cur;
  },0);
}

console.log(sum(1,2,3)); //6

 

27.8.10 Array.prototype.join

- 원본 배열의 모든 요소를 문자열로 변환한 후 , 인수로 전달받은 문자열 (구분자)로 연결한 문자열을 반환

- 구분자는 생략가능하며, 기본 구분자는 콤마(,)

const arr = [1,2,3,4];

arr.join(); //'1,2,3,4'
arr.join(''); //'1234'
arr.join(':'); //'1:2:3:4'

 

27.8.11 Array.prototype.reverse

- 원본 배열의 순서로 반대로 뒤집음

- 원본 배열이 변경

- 반환값은 변경된 배열

const arr = [1,2,3];
const result = arr.reverse();

//원본 배열을 직접 변경
console.log(arr); //[ 3, 2, 1 ]
//반환값은 변경된 배열
console.log(result); //[ 3, 2, 1 ]

 

27.8.12 Array.prototype.fill

- 인수로 전달받은 값을 배열의 처음부터 끝까지 요소로 채움

- 두 번째 인수로 요소 채우기를 시작할 인덱스 전달 가능

- 세 번째 인수로 요소 채우기를 멈출 인덱스 전달

const arr1 = [1,2,3];

//인수로 전달받은 값 0을 배열의 인덱스 1부터 끝까지 요소로 채움
arr1.fill(0,1);

//원본 배열을 직접 변경
console.log(arr1); ////[ 1, 0, 0 ]

const arr2 = [1,2,3,4,5];

//인수로 전달받은 값 0을 인덱스 1부터 3이전까지 요소로 채움
arr2.fill(0,1,3); 

//원본 배열을 직접 변경
console.log(arr2); //[ 1, 0, 0, 4, 5 ]

 

27.8.13 Array.prototype.includes

- 배열 내의 특정 요소가 포함되어 있는지 확인하여 true 또는 false로 반환

- 첫 번째 인수로 검색할 대상 지정

- 두 번째 인수로 검색을 시작할 인덱스 전달 가능

- 두 번째 인수를 생략할 경우 기본값 0 설정

const arr = [1,2,3];

//배열에 요소 1이 포함되어 있는지 인덱스 1부터 확인
arr.includes(1,1); //false

//배열에 요소 3이 포함되어 있는지 인덱스 2부터 확인
arr.includes(3,-1); //true

 

27.8.14 Array.prototype.flat

- 인수로 전달한 깊이만큼 재귀적으로 배열을 평탄화

- 중첩 배열을 평탄화할 깊이를 인수로 전달 가능 (생략할 경우 1)

- 인수로 Infinity를 전달하면 중첩 배열 모두 평탄화 

//중첩 배열을 평탄화하기 위한 깊이 값의 기본값은 1
[1,[2,[3,[4]]]].flat(); //[1,2,[3,[4]]]

//중첩 배열을 평탄화하기 위한 깊이 값을 2로 지정하여 2단계 깊이까지 평탄화 
[1,[2,[3,[4]]]].flat(2); //[1,2,3,[4]]

//중첩 배열을 평탄화하기 위한 깊이 값을 Infinity로 지정하여 중첩 배열 모두를 평탄화 
[1,[2,[3,[4]]]].flat(Infinity); //[1,2,3,4]

'JavaScript' 카테고리의 다른 글

[Deep dive] 28장 Number  (0) 2023.08.17
[Deep dive] 27장 배열(3)  (0) 2023.08.16
[Deep dive] 27장 배열(1)  (0) 2023.08.16
[Deep dive] 26장 ES6 함수의 추가 기능  (0) 2023.08.16
[Deep dive] 25장 클래스 (2)  (0) 2023.08.16