Array메소드
배열의 차수 줄이기(flat()
)
- 모든 하위 배열 요소를 지정한 깊이(value)까지 재귀적으로 이어붙인 새로운 배열을 생성
let arr = [[1, 2], [[1], 4], [100, [3, [10, 11], 9]], 10];
console.log(arr.flat()); // [1,2,[1], 4, 100,[3,[10,11],9],10]
console.log(arr.flat(2)); // [1,2,1,4,100,3,[10,11],9,10]
console.log(arr.flat(3)); // [1,2,1,4,100,3,10,11,9,10]
console.log(arr.flat(Infinity)); // [1,2,1,4,100,3,10,11,9,10]
flat()
은 개념을 보면 어렵게 보일 수 있다.
위의 코드를 보면 제일 큰 배열안에 원소들이 배열로 묶여 있다면 해제를 해준다고 생각하면 이해하기가 쉽다.
flat(value)
에서 value는 몇 단계까지 묶인 배열을 해제하고 싶은지에 대하여 작성해주면된다.
배열의 요소 추가(push()
)
- 배열의 맨 끝에 1개 이상의 요소를 추가하고, 배열의 새로운 길이를 반환
const arr = [1, 2, 3];
const value = arr.push(5);
console.log(value, arr); // value: 4, arr=[1,2,3,5]
배열의 맨뒤 요소 제거(pop()
)
- 배열 내에 존재하는 맨 마지막 요소를 제거후, 해당 요소를 반환한다.
- 배열의 크기가 0일 경우, undefined를 반환
const arr = ["h", "e", "l", "l", "o"];
const value = arr.pop();
console.log(value, arr); //value: "o", arr: ["h","e","l","l"]
배열의 맨 앞에 요소를 추가(unshift()
)
- 배열의 맨 앞에 1개 이상의 요소를 추가하고, 배열의 새로운 길이를 반환
const value = [8, 9, 10];
const count = value.unshift(7);
console.log(value, count);
// [7,8,9,10] , 4(배열의 크기)
배열의 맨 앞에 요소를 삭제(shift()
)
- 배열의 0번째 인덱스에 오는 첫 번째 요소를 제거해 나머지 값의 위치를 한 칸씩 앞으로 당긴다.
- 매개변수가 없으며 제거된 첫 번째 요소를 반환.
- 빈 배열에서 사용하거나 배열의 length가 0일 경우 undefined를 반환.
const value = [8, 9, 10];
const count = value.shift();
console.log(value, count);
// [9,10] , 8(제거된 요소의 값)
배열들의 요소들로 문자열로 변경(join()
)
- 배열 내 원소들을 연결해 하나의 값(문자열)으로 만든다. 요소가 null 또는 undefined 일 경우 빈 문자열(
""
)로 반환된다.
var arr = ["JJamva", "world"];
arr.join(""); //'JJamvaworld'
arr.join(" "); //'JJamva world'
var arr2 = ["JJamva", null];
arr2.join(" world"); //'JJamva world'
var arr3 = ["JJamva"];
arr3.join(" world"); //'JJamva'
문자가 한개만 존재한다면 join()안에 들어간 value는 무시하고 문자열로 변환된다.
즉, 요소가 한개이기 때문에 연결된 문자가 없어 join()에 들어간 value는 동작하지 않는다.
var a = [010, 2222, 1111];
console.log(a.join(""));
출력의 결과는 '822221111'로 나온다.
010의 형태가 8진법의 형태라 8이라는 값이 나온다.
배열의 요소를 문자열로 변형 후, 처리하고 parseInt() 작업을 하면 원하는 값이 출력된다.
특정한 인덱스에 요소를 위치(제거)시킬 때(splice()
)
- 배열 내에 새로운 요소의 추가가 가능하며 원하는 인덱스에 위치가 가능.
- 기존에 존재하는 요소를 삭제하거나 변경
배열.splice(요소를 위치시키고자 하는 인덱스, 제거할 요소의 개수, 배열에 추가할 요소)
- 요소를 삽입하고 싶다면
배열에 추가할 요소
매개변수를 작성 - 요소를 삭제하고 싶 다면
배열에 추가할 요소
매개변수를 작성하지 않으면 된다.
- 요소를 삽입하고 싶다면
splice()
를 이용하면 원본의 데이터를 수정.
// splice를 이용하여 요소를 삽입
const cafe = ["coffee", "cake", "tea", "cookie"];
cafe.splice(1, 0, "bread");
console.log(cafe);
//['coffee', 'bread', 'cake', 'tea', 'cookie']
const cafe = ["coffee", "cake", "tea", "cookie"];
cafe.splice(-1, 2, "bread");
console.log(cafe);
//['coffee', 'cake', 'tea', 'bread']
// splice범위를 보면 -1의 인덱스에서 요소를 2개라고 지정하고 'bread'를 넣어달라는 문법이다.
// 즉, 그럼 cookie부터 2개의 요소를 지워야하지만 cookie가 마지막 인덱스 요소임으로 하나만 지우고 bread를 삽입했다.
// splice를 이용하여 요소를 삭제
const cafe = ["coffee", "cake", "tea", "cookie"];
cafe.splice(1, 1);
console.log(cafe);
//['coffee','tea','cookie']
const cafe = ["coffee", "cake", "tea", "cookie"];
cafe.splice(-2, 1);
console.log(cafe);
//['coffee','cake','cookie']
배열의 정렬(sort()
)
- 배열 내 요소를 오름차순으로 정렬(default)하는데 이 과정에서 요소를 문자열로 취급해 재정렬.
- 배열이 반환되지만 복사본이 만들어지는 것이 아니라 배열 자체가 변경.
let data = [1, 11, 2, 111, 22];
data.sort((a, b) => a - b); //오름차순 [1,2,11,22,111]
data.sort((a, b) => b - a); //내림차순 [111,22,11,2,1]
data.sort((a, b) => {
return a - b;
});
// 오름차순 data.sort((a,b) => (a-b))와 같은 기능
배열.sort((a,b) => (a-b))는 콜백함수
a - b
에서 0보다 작으면 a가 우선순위가 된다.
a - b
가 0일 경우 변경되지 않는다.
a - b
가 0보다 크면 b가 우선순위가 된다.
parameter값이 없는 sort()
let alpha_data = ["a", "z", "b", "e", "ab"];
alpha_data.sort();
console.log(alpha_data);
//['a', 'ab', 'b', 'e', 'z']
let num_data = [1, 11, 2, 111, 22];
num_data.sort();
console.log(num_data);
//[1, 11, 111, 2, 22]
상세한 정렬을 하지 않을 경우, 원소들 끼리의 크기 비교가 아닌 사전 순서식으로 정렬
문자열 정렬
var a = ["c", "bbb", "aaaaa", "abc", "bca"];
a.sort((a, b) => a - b);
// ["c", "bbb", "aaaaa", "abc", "bca"]
문자열로 구성된 배열에서 sort((a,b) => a - b)
기능이 동작되지 않는다.
왜 동작이 되지 않을까?
이유는 숫자의 연산과 같은 경우 반환값이 음수
, 양수
, 0
으로 사용.
문자열의 경우 연산의 결과가 숫자로 표현되지않기 때문에 정렬에 의미가 없다.
그럼 숫자 연산에 대한 반환값을 문자열에 일일이 적용하면 정렬이 가능할까? 라는 생각이 든다.
var a = ["c", "bbb", "aaaaa", "abc", "bca"];
a.sort((a, b) => {
if (a < b) {
return -1;
} else if (a > b) {
return 1;
//return true를 대신 사용해도 가능
//true의 값은 1을 의미
} else {
return 0;
//return false를 대신 사용해도 가능
//false의 값은 0을 의미
}
});
console.log(a);
// ['aaaaa', 'abc', 'bbb', 'bca', 'c']
출력보면 문자열에 대한 오름차순 정렬이 되었다.
내림차순을 정렬하려면 조건문의 부등호 방향만 바꿔주면 된다.
localeCompare()
메소드 사용
- 문자열을 비교하여 순서를 정할 때 사용하는 메소드
var a = ["c", "bbb", "aaaaa", "abc", "bca"];
a.sort((a, b) => a.localeCompare(b));
console.log(a);
// ['aaaaa', 'abc', 'bbb', 'bca', 'c']
a.sort((a, b) => b.localeCompare(a));
console.log(a);
// ['c', 'bca', 'bbb', 'abc', 'aaaaa']
각 요소를 사용하여 새로운 배열을 만들 때(map()
)
- 배열 내에 있는 요소에 순차적으로 접근해서 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환
- 기 존의 값을 재정의할 수도 있지만 새로운 형태의 값을 정의하는 것 또한 가능
- 객체나 json 형태의 데이터를 탐색하는 용도로 사용할 수 있다.
// Array형태
let arr = [1, 2, 3];
arr.map((e) => e ** 2);
console.log(arr);
//[1,4,9]
// 객체(Json)형태
const arr = [
{
name: "title1",
contents: "contents1",
dataNum: 1,
data: [1, 2, 3],
},
{
name: "title2",
contents: "contents2",
dataNum: 2,
data: [1, 2, 3],
},
];
arr.map((i) => {
return i.name;
});
// 중괄호를 이용하여 표현이 가능하다.
console.log(arr)[
// ['title1', 'title2']
(1, 2, 3, 4)
].map(function (v) {
return "hello" + v;
});
// 함수형태로도 표현이 가능하다.
// ['hello1','hello2','hello3','hello4']
배열 요소를 실행하고 싶을 때(forEach()
)
배열.forEach((value,index,array) => {})
- 배열의 각 요소에 콜백을 1회 씩 실행
- 희소 배열 대해서는 실행하지 않는다.
- 콜백은 요소 값, 요소 인덱스, 순회 중인 배열과 같은 세 인수가 호출
- 배열을 직접적으로 변형하는 메소드는 아니지만 콜백이 변형할 수 있다는 특징이 있다.
희소 배열이란??
배열 내에 요소들 중 일부만이 실제로 존재하고 나머지 요소들은 비어있는 배열.
즉, 배열의 크기보다 실제로 저장된 요소의 개수가 적을 때 희소 배열이라고 부른다.
let arr = [1,2,3,4]
let sum = 0
arr.forEach((v,i) =>
if(v % 2 === 1) sum += v
)
console.log(sum) //4
Array(10).fill(2).forEach((v,i) =>
console.log(v,i);
)
// 요소가 전부 2인 10칸짜리 배열을 생성한 후
// 순차적으로 값과 인덱스를 출력한다.
// (2,0) (2,1) .... (2,9)
map()
과 forEach()
의 차이
map()
은 새로운 배열을 생성
forEach()
는 순회만 하며, 반환값(return)이 없다.