본문 바로가기

블록체인 sw개발자

[JS] 배열함수

배열

배열은 JavaScript에 내장되어 있는 자료구조입니다. 배열은 객체의 일종이지만, 내부적으로 특별하게 취급되어 일반적인 객체들과는 다른 특징을 갖고 있습니다.

type[]; //'object'

배열 안에 들어있는 값들은 요소(element) 혹은 항목(item)이라고 합니다. "배열 [1, 2, 3]은 세 개의 요소를 갖고있다"

또는 "배열 [1, 2, 3] 의 두 번째 항목은 두 번째 항목은 2 이다." 와 같이 말할 수 있습니다. 객체와 배열의 가장 큰 차이점은 , 배열의 각 요소 간에는 순서가 있다는 점입니다.

 

배열은 Array 생성자의 인스턴스입니다. 그러니까, 배열의 프로토타입으로 Array.prototype 객체가 지정되어 있습니다. 이 객체에 여러 메소드들이 내장되어 있는데 , 그목록을 확인 해보세요.

 

 

 


배열 생성하기

 

 

배열 리터럴

 

배열은 배열 리터럴(array literal)을 통해서 생성하는 것이 가장 쉽습니다.

 

const empty = []; // 빈 배열
const numbers = [1, 2, 3]; // 숫자가 들어있는 배열
const strings = ['one', 'two', 'three']; // 문자열이 들어있는 배열
const objects = [{prop: 1}, {prop: 2}, {prop: 3}]; // 객체가 들어있는 배열
const mixed = [1, 'one', {prop: 1}, null]; // 아무거나(?) 들어있는 배열

 

Array 생성자

 

Array 생성자를 통해서도 배열을 생성할 수 있습니다.

Array 생성자는 주어지는 인수에 따라 두 가지 서로 다른 방식으로 동작을 합니다.

 

  1. 수 타입의 인수가 하나 주어질 떄는 해당 수 만큼의 길이를 갖는 비어있는 배열을 만들어 냅니다.
  2. 이 외에 다른 모양으로 인수가 주어지면 그 인수들을 요소로 갖는 배열을 생성합니다.

 

new Array(1); //[Empty]
new Array(1000); //[Empty x 1000]

new Array(1, 2, 3); //[1, 2, 3]

Array.of

이렇게 일관적이지 못한 생성자의 동작방식 때문에, ES2015에 Array.of 정적 메소드가 추가되었습니다. 이 메소드는 위의 2번 방식으로만 동작합니다. 따라서 , Array 생성자를 사용할 때에는 1번 방식으로만 사용하고 2번 방식의 코드를 작성할 때는 생성자 대신 Array.of 정적 메소드를 사용하세요.

new Array(1, 2, 3); //이렇게 하지마세요.
Array.of(1, 2, 3); // 대신 이렇게 하세요.


// 'Array.of' 정적 메소드는 인수가 하나이더라도 그 인수를 요소로 갖는 배열을 반환합니다.
Array.of(1); //[1]

// 생성자는 이런 용도로만 사용하세요.
new Array(1000); // [Emty x 1000]
const array = Array.of(1,2,3, "박", [1 , 2, 3])
console.log(array);

 

Array.from

 

Javascript에는 유사 배열 객체(array-like-object)와 iterable 이라는 개념이 있어서, 이에 해당하는 값들은 Array.from 정적으로 메소드를 통해 배열로 쉽게 변환될 수 있습니다. 앞의 두 개념에 대해서는 Iterable 챕터에서 자세히 다룹니다.

// 'String' 타입은 래퍼 객체를 통해 iterable로 다루어질 수 있다
Array.from('hello'); //["h", "e" , "l", "l" , "o"]

 

 


요소 읽기

 

배열의 각 요소는 인덱스(index)를 이용해 읽어올 수 있습니다. 인텍스는 객체의 속성 이름과 비슷한 역할을 하지만, 0이상의 정수만이 배열의 인덱스가 될 수 있습니다.

 

배열을 생성하면, 배열 안에 들어있는 각 요소는 순서대로 0부터 시작하는 인덱스를 갖게 됩니다. 대문자 표기법에 인덱스를 사용함으로써 원하는 요소를 가져올 수 있습니다.

 

const arr = ['one', 'two', 'three'];
arr[0]; // 'one'
arr[1]; // 'two'
arr[2]; // 'three'
arr[3]; // undefined

위에서 볼 수 있듯이, 인덱스는 0부터 시작합니다. 즉, 첫 번째 요소를 가리키는 인덱스는 1이 아니라 0입니다, 

 

 

 


요소 수정하기

 

 

객체와 마찬가지로 대괄호 표기법을 이용해서 요소를 수정 할 수 있습니다.

const arr = [false, false, false];
arr[1] = true;
console.log(arr); // [false, true, false]

fill 메소드를 사용하면 한꺼번에 많은 요소를 같은 값으로 바꾸어 버릴 수도 있습니다.

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

// 전체를 0으로 채우기
arr.fill(0);
console.log(arr); // [0, 0, 0, 0, 0];

//인덱스 2와 4사이를 1로 채우기
arr.fill(1, 2, 4);
console.log(arr); // [0, 0, 1, 1, 0];

Array 생성자와 fill 메소드를 사용하면, 큰배열을 만들고 값을 채워넣는 일을 쉽게 할 수 있습니다.

 

new Array(1000); // [empty * 1000]
new Array(1000).fill(5); // [5, 5, 5, 5, 5,.....];

 

 


배열의 끝 부분에서 요소를 추가/제거하기(push, pop)

 

 

push 메소드와 pop 메소드를 사용하면 배열의 끝 부분에서 요소를 추가하거나 제거할 수 있습니다.

const arr = [];
arr.push('one'); // 1(요소가 추가된 후의 배열의 길이를 반환)
arr.push('two', 'three'); // 3

console.log(arr); // ['one', 'two', 'three']

// 베열의 요소 삭제하기
arr.pop(); // 'three'
arr.pop(); //'two'
arr.pop(); // 'one'
arr.pop(); // undefined (더 이상 배열에 요소가 남아있지 않으면 'undefined'를 반환)

 

 

 


 메서드는 문자열에 다른 문자열이 포함되어 있는지 여부를 확인(Includes)

 

includes() 함수는 배열이 특정값을 포함하고 있는지의 여부를 boolean 값으로 반환합니다.

arr.includes(valueToFind[, fromIndex])

 

const arr = [1, 2];

document.writeln(arr.includes(1)); // true
document.writeln(arr.includes(3)); // false
document.writeln(arr.includes(1, 1)); // false
document.writeln(arr.includes(1, 2)); // false
document.writeln(arr.includes(2, -1)); // true

 

arr.includes(1); // true

arr[0]의 값이 1이므로 true를 리턴합니다.


arr.includes(3); // false

arr에는 3이라는 값이 없으므로 false를 리턴합니다.


arr.includes(1, 1); // false

arr[1] 이후에는 1이라는 값이 없으므로 false를 리턴합니다.


arr.includes(1, 2); // false

두 번째 파라미터인 fromIndex에 배열의 길이보다 크거나 같은 값이 들어가면 무조건 false를 리턴합니다.

여기서 배열의 길이는 2인데, fromIndex 자리에 2가 들어갔으므로 false가 리턴되었습니다.


arr.includes(2, -1); // true

fromIndex 자리에 음수가 들어가면, 실제 시작 index는 '배열의 길이 + fromIndex'로 계산됩니다.

배열의 길이는 2이고, fromIndex는 -1이므로, 

실제 검색을 시작하는 index는 1이 됩니다.  (2 + (-1))

arr[1]에 2가 있으므로, true가 리턴 되었습니다.


배열의 시작 부분에서 요소를 추가/제거하기(unshift, shift)

 

반대로 unshift, shift 메소드를 사용해 배열의 시작 부분에서 요소를 추가하거나 제거할 수도 있스빈다.

const arr = [];
arr.unshift(1); // 1 (요소가 추가된 후의 배열의 길이를 반환)
arr.unshift(2, 3); // 3

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

// 배열의 요소 삭제하기
arr.shift(); // 2
arr.shift(); // 3
arr.shift(); // 1
arr.shift(); // undefined (더 이상 배열에 요소가 남아있지 않으면 `undefined`를 반환)

 

 


요소를 배열 중간에 삽입하기(splice)

자바스크립 splice() 메서드는 배열 객체에 사용할 수 있는 메서드입니다. 이는 기존 요소를 사제하거나 교체하여 배열의 내용을 변경하며, 제거된 요소가 담긴 별도의 배열을 새로 반환합니다

 

splice() 메서드를 사용할 때는 start 매개변수에 꼭 값을 전달해야 하는데, 이 매개변수는 배열의 변경을 시작할 인덱스를 지정합니다. 위의 예시에서 인수로 전달된 2splice() 메서드가 인덱스 2 에서부터 요소를 제거 하기 시작할 것이라는 뜻입니다.

 

splice 메소드를 사용하면 배열에 속해있는 연속된 여러 요소, 즉 배열의 일부분을 통째로 바꿔 버릴 수 있습니다.

let arr = [1, 2, 3, 4, 5];

// 인덱스 '1'인 요소부터 '3' 개를 바꿔치기 합니다.
//'splice' 메소드는 바꿔치기를 통해 제거된 요소들을 반환합니다.]
arr.splice(1, 3, 'two', 'three', 'four'); // [2, 3, 4]
console.log(arr); // [1, 'two', 'three', 'four', 5]

splice로 반드시 같은 개수의 요소만 바꿔치기할 수 있는건 아닙니다.

const arr = [1, 2, 3, 4, 5];
arr.splice(1, 3); // [2, 3, 4]
console.log(arr); // [ 1, 5]

이렇게 splice 메소드를 배열의 중간 부분에 있는 요소를 제거하는 데도 활용할 수 있습니다.

const idx = [1, 2 , 3 , 4, 5]
idx.splice(2)
console.log(idx);



// [1, 2]

 

새로운 배열 객체 변환 (slice)

 

자바스크립트의 slice 함수는 원본 배열을 유지하고 begin부터 end 까지(end미포함)의 새로운 배열 객체를 반환합니다.

arr.slice([begin[,end]])

파라미터

1. begin(Optional)

 

  • 추출 시작할 배열의 index
  • 음수 index일 경우 배열의 끝에서부터의 길이를 의미

           1.예) slice(-2)는 배열의 마지막 2개의 요소를 추출

  • 값이 undefined일 경우 index 0 과 동일 동작
  • 배열의 길이보다 큰 index일 경우 빈 배열 반환

 

2. end(Optional)

  • 추출 종료할 배열의 index, end index를 제외하고 추출

            1.예) slice(1,4)는 두번째 요소부터 네번째 요소까지 (1, 2, 3) 추출

  • 음수 index일 경우 배열의 끝에서부터의 길이를 의미

            1.예) slice(2, -1)는 세번째 요소부터 끝에서 두번째 요소까지 추출

  • 값이 생략 될 경우 배열의 끝(array.length)까지 추출
  • 배열의 길이보단 큰 index일 경우도 마찬가지로 배열의 끝(array.length)까지 추출

반환 값

추출한 요소를 포함한 새로운 배열

 

ex)

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

      console.log(numbers.slice()); // index 0부터 추출
      // (5) [1, 2, 3, 4, 5]
      console.log(numbers.slice(1)); // index 1부터 추출
      // (4) [2, 3, 4, 5]
      console.log(numbers.slice(-2)); // 마지막요소부터 마지막에서 두번째 요소까지추출
      // (2) [4, 5]
      console.log(numbers.slice(99)); // 배열 길이보다 클 경우 빈 배열
      // []
      console.log(numbers.slice(1, 4)); // index 1부터 index 4까지(index 4제외) 추출
      // (3) [2, 3, 4]
      console.log(numbers.slice(2, -1)); // index 2부터 마지막에서 첫번째 요소까지
      // (마지막에서 첫번째 요소 제와) 추출
      // (2) [3, 4]
      console.log(numbers.slice(2, 99)); // index 2부터 마지막에서 요소까지 추출
      //(end가 배열의 길이보다 큼)
      // (3) [3, 4, 5]

 

 

결과를 단일 값으로 리턴하는 배열의 내장 메서드(reduce) ☆☆

자바스크립트의 reduce 함수는 배열의 각 요소를 순회하며 callback 함수의 실행 값을 누적하여 하나의 결과값을 반환 합니다.

arr.reduce(callback(accumulator, currentValue[, index[,array]])[,initialValue]);

calback은 배열의 각 요소에 대해 실행할 reducer 함수로 4개의 인수를 받습니다.

  • accumulator - callback 함수의 리턴 값을 누적합니다.
  • currentValue - 현재 처리 중인 배열 요소입니다.
  • index(Optional) - 현재 처리 중인 배열의 인덱스입니다.
  • array (Optional) - reduce를 호출한 배열입니다.
  • initialValue (Optional) - accumulator의 초깃값입니다. 별도의 지정된 값이 없을 때는 배열의 첫 번째 요소가 초깃값으로 사용됩니다.

ex)

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      const sum = numbers.reduce(function (accumulator, currentValue) {
        return accumulator + currentValue;
      }, 0);
      console.log("sum = ", sum);

// sum = 55

reduce 함수는 numbers  배열의 요소를 모두 더한 값을 구합니다. 초깃값으로 0(zero)으로 설정했으며, 각 요소가 순회할 때마다 accumulator에 currentValue의 횬재 값이 더해지며 최종 결과는 sum에 리턴됩니다.

 

 

화살표 함수로 바꿔 보자.

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      const sum1 = numbers.reduce(
        (accumulator, currentNumber) => accumulator + currentNumber);

console.log("sum1 =", sum1);

// sum1 = 55

 

2. ex) 오브젝트 배열에서 원하는 항목의 값만 더해보자

 

const friends = [
        {
          name: "Gildong",
          age: 30,
          job: "Bandit",
          married: "false",
        },
        {
          name: "Cheolsu",
          age: 12,
          job: "student",
          married: "false",
        },
        {
          name: "Mr.Park",
          age: 32,
          job: "Developer",
          married: "true",
        },
      ];

      // 3명의 나이를 더해봅니다.
      // 여기서 초기값 설정이 반드시 필요합니다.
      const ageSum = friends.reduce((accumulator, currentObject) => {
        return accumulator + currentObject.age;
      }, 0);

      console.log("친구들 나이 합", ageSum);
      
      //친구들 나이 합 74

 

 

3. ex) 프로그래머스  문자열 정수의 합 

// 한 자리 정수로 이루어진 문자열 num_str이 주어질 때, 
// 각 자리수의 합을 return하도록 solution 함수를 완성해주세요.


function solution(num_str) {
    return [...num_str].reduce((acc, cur) => acc+Number(cur),0)
}

'블록체인 sw개발자' 카테고리의 다른 글

[JS] 함수  (0) 2023.06.30
[JS] while, 구구단 만들기  (0) 2023.06.29
[JS] 호이스팅 var, let의 차이  (0) 2023.06.27
[JS] 호이스팅  (0) 2023.06.27
JS Runtime  (0) 2023.06.26