배열에 대하여(Array) on redgoose note

배열에 대하여(Array)

Nest: Development Category: Javascript 2013-03-16

  • 배열은 순서있는 값들의 집합이다.
  • 배열 안의 각각 값을 원소라고 하며, 각 원소는 배열 안에서 그 위치를 가리키는 인덱스(Index)라는 번호를 할당받게 된다.
  • 각 원소는 서로 다른 타입의 원소가 들어갈 수 있다. 엄격한 데이터타입의 프로그래밍 언어에서는 그렇지 않다.
var empty = []; // 빈 배열
var primes = [2, 3, 4, 7, 11]; // 5개의 숫자 값들로 이루어진 배열
var misc = [1.1, true, "a", ]; // 서로 다른 타입을 가진 3개의 원소로 이루어진 배열

배열 리터럴에서는 임의의 표현식도 사용할 수 있다.

var base = 1024;
var table = [base, base+1, base*2, base/3];

배열 리터럴은 객체 리터럴이나 또 다른 배열 리터럴을 포함할 수 있다.

var b = [[1, {x:1, y:2}], [2, {x:3, y:4}]];

배열을 생성하는 또 다른 방법은 Array() 생성자를 사용하는 것이다.

// 전달인자 겂이 호출하는 방법
var a = new Array(); // 아무 원소도 없는 빈 배열을 생성한다.

명시적으로 원소를 정의하여 호출하는 방법

var a = new Array(5, 4, 3, 2, 1, "testing, test");

배열의 길이를 지정하는 숫자값을 전달인자로 호출하는 방법

var a = new Array(10); // 원소의 값이 undefined가 10개가 들어가있다.

Array()생성자로 사용하는것보다 배열 리터럴로 사용는것이 문장이 더 간결해지도 수월하다.

배열원소 읽고,쓰기

배열의 각 원소에 접근할 때에는 [] 연산자를 사용한다.

value = a[0];
a[1] = 3.14;
i = 2;
a[i] = 3;
a[i+1] = "hello";
a[a[i]] = a[0];

자바스크립트의 인덱스 번호는 0번부터 시작한다.

배열의 인덱스는 정수를 사용해야하며, 너무 큰 수나 음의정수, 부동소수점값, 불리언값과같은 객체같은 다른값을 인덱스로 사용하려면 문자열로 변환하고 이 문자는 객체의 프로퍼티 이름으로 간주한다.

배열에 새로운 원소 추가하기

  • C나 자바는 원소의 개수를 생성당시 지정되고 개수가 변하지 않지만 자바스크립트는 임의의 개수의 원소를 가질 수 있으며, 언제든지 개수 변경이 가능하다.
  • 배열에 새로운 원소를 추가하려면 그 값을 할당하기만 하면 된다. a[10] = 10;
  • 배열의 인덱스는 연속되지 않아도 된다. 0번 인덱스와 10,000번 인덱스에 값을 할당할 경우에 0번과 10,000번에 메모리를 할당하지만 그 사이에 있는 인덱스에는 메모리를 할당하지 않는다.
    a[0] = 1;
    a[10000] = 10000;

배열원소 삭제하기

  • 배열 원소를 삭제하려면 delete연산자를 사용하며 delete연산자를 사용하면 원소의 값이 undefined값으로 바뀐다. 하지만 원소 그 자체는 사라지지 않는다.
  • 배열 원소를 배열에서 완전히 삭제하고, 삭제한 원소의 뒤쪽에 위치한 원소들을 앞쪽으로 옮겨서 저장하려면 배열 메서드를 사용해야한다.
  • Array.shift() 메서드는 배열의 첫번째 원소를 삭제하고, Array.pop() 메서드는 배열의 마지막 원소를 삭제하며, Array.splice() 메서드는 연속된 범위 안의 원소들을 일괄적으로 삭제한다.

배열의 길이

배열의 수를 알려주기위한 length라는 프로퍼티로 배열의 길이를 유추해낼 수 있다. length프로퍼티는 배열 안에서 가장 큰 인덱스값보다 하나 더 큰 값을 가지고 있다.
length 프로퍼티는 새로운 원소가 추가될때마다 자동으로 갱신된다.

var a = new Array(); // a.length == 0 (아무런 원소도 정의되지 않았다.)
a = new Array(10); // a.length == 10 (빈 원소가 0부터 9까지 정의된다.)
a = new Array(1,2,3); // a.length == 3 (원소가 0부터 2까지 정의된다.)
a = [4, 5]; // a.length == 2 (원소가 0, 1번이 정의된다.)
a[5] = -1; // a.length == 6 (원소 0, 1, 5번이 정의된다. 2, 3, 4번은 빈원소가 정의된다.)

배열 순회하기

length 프로퍼티의 가장 일반적인 용도는 배열의 모든 원소를 순회하는 작업에 쓰일 것이다.

var fruits = ["mango", "banana", "cherry", "pear"];
for (var i=0; fruits.length>i; i++) {
    alert(fruits[i]);
}

배열의 순회는 배열안의 0번 인덱스에서 시작하여 연속적으로 나열되어 있다고 가정한다. 중간에 값이빠진 원소가 있을수도 있으니 if문으로 검사를 할 수 있다.

for (var i=0; fruits.length>i; i++) {
    if (fruits[i]) alert(fruits[i]);
}

루프구문은 배열의 원소를 초기화하는데에도 사용할 수 있다.

var lookup_table = new Array(1024);
for (var i=0; lookup_table.length>i; i++) {
    lookup_table[i] = i * 512;
}

다차원 배열

자바스크립트는 완전히 다차원배열을 사용하지않지만 []연산자를 중첨해서 사용하면 다차원 배열을 흉내낼 수 있다.

var table = new Array(10); // 구구단의 10개의 행
for (var i=0; table.length>i; i++) {
    table[i] = new Array(10); // 각 행에는 10개의 열이 있다.
}

// 배열을 초기화한다.
for (var row=0; table.length>row; row++) {
    for (col=0; table[row].length>col; col++) {
        table[row][col] = row * col;
    }
}

Array.map() 메서드에서 continue 같은 기능을 사용하기

Array.map() 메서드에서는 continue를 사용할 수 없고 사용할 수 있는 방법이 없다.
그래서 앞에 Array.filter()메서드를 붙여서 먼저 요소를 빼두는것을 추천한다.

let obj = [1,2,3,4,5].filter((o) => {
  if (o === 1 || o === 3 || o === 5)
  {
    return true;
  }
  else
  {
    return false; // skip
  }
}).map((o) => {
  return o;
});

// result: [1,3,5]

출처: https://stackoverflow.com/a/24806827