1. Array
2. 배열 선언, 접근, 속성
3. 배열의 실체
4. 배열 타입 확인 및 요소 삭제
5. 배열 조작
6. 배열 반복문
7. 배열 탐색
8. 배열 변형
9. 고차함수 배열 메서드
10. sort()
11. forEach(), map()
12. find(), filter()
13. reduce()
14. some(), every()
15. N차원 배열
- 여러 개체(Entity)값을 순차적으로 나열한 자료 구조 (알고리즘 내 사용 빈도 많음)
- 배열 내 값을 요소(element)라고 하며, 배열 요소는 index로 접근
- 대표 속성(property)과 메서드(method)
- 배열 크기 및 배열 여부 확인: Array.length, Array.isArray()
- 배열 추가/삭제: Array.push(), Array.pop(), Array.shift(), Array.unshift(), Array.splice(), Array.slice() 등
- 배열 탐색: Array.indexOf(), Array.lastIndexOf(), Array.includes()
- 배열 변형(callback 미사용): Array.sort(), Array.reverse(), Array.join()
- 선언: "new Array()" 혹은 "[]"를 통해 선언하며, 사이즈 혹은 값을 입력하여 초기화도 가능
- 접근 방법: "Array[index]"를 통해 index를 통하여 O(1) 접근
- 배열 속성: "Array.length"를 통해 배열 요소의 개수 확인 가능
let arr_1 = new Array(10);
let arr_2 = [];
console.log(arr_1); // output: [ <10 empty items> ]
console.log(arr_2); // output: []
let fruits = ["apple", "orange", "melon"];
console.log(fruits); // output: ["apple", "orange", "melon"]
console.log(fruits.length); // output: 3
console.log(fruits[0]); // output: apple
fruits[1] = "kiwi";
console.log(fruits); // output: ["apple", "kiwi", "melon"]
- 자바스크립트에서 배열은 다른 언어에서 말하는 일반적인 배열이 아닌 Hash 기반의 객체
- 메모리가 연속적인 밀집 배열(dense array)가 아닌 비 연속적인 희소 배열(sparse array)
let nums = [];
nums.push("one");
nums.push("two");
console.log(nums.length); // output: 2
console.log(nums); // output: ["one", "two"]
nums["once"] = "once";
nums["twice"] = "twice";
console.log(nums.length); // output: 2
console.log(nums); // output: ["one", "two", once: "once", twice: "twice"]
console.log(Object.getOwnPropertyDescriptors(nums));
/* output:
{
'0': { value: 'one', writable: true, enumerable: true, configurable: true },
'1': { value: 'two', writable: true, enumerable: true, configurable: true },
length: { value: 2, writable: true, enumerable: false, configurable: false },
once: { value: 'once', writable: true, enumerable: true, configurable: true },
twice: { value: 'twice', writable: true, enumerable: true, configurable: true }
}
*/
- 배열 타입 확인: Array.isArray(value)
- 배열 요소 삭제: delete array[index] (삭제해도 배열 사이즈가 그대로인 문제점)
let num = 123;
let str = "here";
let fruits = ["apple", "orange"];
console.log(Array.isArray(num)); // output: false
console.log(Array.isArray(str)); // output: false
console.log(Array.isArray(fruits)); // output: true
console.log(fruits.length); // output: 2
delete fruits[1];
console.log(fruits.length); // output: 2
console.log(fruits); // output: [ "apple", <1 empty item> ]
- 배열 추가: Array.push(element), Array.unshift(element)
- 배열 삭제: Array.pop(), Array.shift(), Array.slice(start, end)
- 배열 삭제/변경: Array.splice(index, deleteCount, elem1, ..., elemN)
- 배열 병합: Array.concat(arg1, arg2...)
/* push, pop */
let fruits = ["apple", "orange", "melon"];
let ret = fruits.push("watermelon");
console.log(fruits); // output: ["apple", "orange", "melon", "watermelon"]
console.log(ret); // output: 4
ret = fruits.pop();
console.log(fruits); // output: ["apple", "orange", "melon"]
console.log(ret); // output: watermelon
/* shift, unshift */
ret = fruits.shift();
console.log(fruits); // output: ["orange", "melon"]
console.log(ret); // output: apple
ret = fruits.unshift("watermelon");
console.log(fruits); // ["watermelon", "orange", "melon"]
console.log(ret); // output: 3
/* splice */
console.log(fruits.splice(1)); // output: ["orange", "melon"]
console.log(fruits); // output: ["watermelon"]
fruits = ["apple", "orange", "melon", "strawberry"]
console.log(fruits.splice(1, 1)); // output: ["orange"]
console.log(fruits); // output: ["apple", "melon", "strawberry"]
console.log(fruits.splice(1, 1, "mango", "kiwi")); // output: ['melon']
console.log(fruits); // output: ["apple", "mango", "kiwi", "strawberry"]
/* slice */
let fruits = ["apple", "orange", "melon"];
console.log(fruits.slice(1)); // output: ["orange", "melon"]
console.log(fruits); // output: ["apple", "orange", "melon"];
console.log(fruits.slice(1, 2)); // output: ["orange"]
console.log(fruits.slice(-2)); // output: ["orange", "melon"]
/* concat */
let fruits = ["apple", "orange", "melon"];
console.log(fruits.concat("strawberry")); // output: ["apple", "orange", "melon", "strawberry"]
console.log(fruits.concat(["cherry", "banana"])); // output: ["apple", "orange", "melon", "cherry", "banana"]
console.log(fruits.concat(["cherry", "banana"], "mango"));
// output: ["apple", "orange", "melon", "cherry", "banana", "mango"]
- 반복문 문법: for ... length(index 접근), for ... of (element 접근), for ... in (key 접근)
let fruits = ["apple", "orange", "melon"];
// use for index
// output apple, orange, melon
for (let i=0;i<fruits.length;i++){
console.log(fruits[i]);
}
// use for ...(element) of
// output: apple, orange, melon
for (let fruit of fruits){
console.log(fruit);
}
// use for ...(key) in
// output: 0, 1, 2
for (let key in fruits){
console.log(key);
}
- index 탐색(앞에서부터): Array.indexOf(item, from)
- index 탐색(뒤에서부터): Array.lastIndexOf(item, from)
- 값 포함 여부 확인: Array.includes(item, from)
let fruits = ["apple", "orange", "banana", "orange", "melon"];
console.log(fruits.indexOf("orange")); // output: 1
console.log(fruits.indexOf("Orange")); // output: -1
console.log(fruits.indexOf("orange", 2)); // output: 3
console.log(fruits.lastIndexOf("orange")); // output: 3
console.log(fruits.lastIndexOf("orange", -3)); // output: 1
console.log(fruits.lastIndexOf("orange", 0)); // output: -1
console.log(fruits.includes("orange")); // output: true
console.log(fruits.includes("Orange")); // output: false
- 배열 정렬: Array.sort()
- 배열 순서 반대: Array.reverse()
- 배열 변환(문자열로 변환): Array.join(separator)
let nums = [1, -1, 4, 5, 2, 0];
console.log(nums.reverse()); // output: [0, 2, 5, 4, -1, 1]
console.log(nums.sort()); // output: [-1, 0, 1, 2, 4, 5]
let fruits = ["apple", "orange", "banana"];
console.log(fruits.join("")); // output: appleorangebanana
console.log(fruits.join()); // output: apple,orange,banana
console.log(fruits.join(";")); // output: apple;orange;banana
- 고차함수 : 하나 이상의 함수를 매개변수로 취하거나 함수를 결과로 반환하는 함수
- 매개변수로 전달되는 함수는 콜백 함수(Callback function)
- 임의 정렬: Array.sort()
- 반복 작업: Array.forEach()
- 콜백함수 결과 배열 반환: Array.map()
- 조건 만족하는 하나의 값 반환: Array.find()
- 조건 만족하는 값 배열로 변환: Array.filter()
- 누적 결과 값 반환: Array.reduce()
- 문제점: sort 메서드로 정렬될 때 배열의 요소가 일시적으로 문자열로 변경되어 발생
- 해결방법: 오름차순 sort((x, y) => x-y), 내림차순 sort((x, y) => y-x)
- 문제점: 대소문자 구분 없이 정렬하고 싶지만, 대소문자 구분되어 정렬
- 해결방법: toUppercase()를 통해 통일시킨 후 정렬
let nums = [-1, 1, 4, 0, 2, 10, 20];
console.log(nums.sort()); // output: [-1, 0, 1, 10, 2, 20, 4]
console.log(nums.sort((x,y)=> x-y)); // output: [-1, 0, 1, 2, 4, 10, 20]
let fruits = ["apple", "orange", "melon", "Orange"];
console.log(fruits.sort()); // output: ["Orange", "apple", "melon", "orange"]
console.log(fruits.sort((x, y)=>{
x = x.toUpperCase();
y = y.toUpperCase();
if (x>y) return 1;
else if (y>x) return -1;
else return 0;
}))
// output: ["apple", "melon", "orange", "Orange"]
/* 공용화 함수 */
let ascending_order = function(x, y){
if (typeof x === "string") x = x.toUpperCase();
if (typeof y === "string") y = y.toUpperCase();
return x > y ? 1 : -1;
};
let descending_order = function(x, y){
if (typeof x === "string") x = x.toUpperCase();
if (typeof y === "string") y = y.toUpperCase();
return x <> y ? 1 : -1;
};
let nums = [1, -1, 4, 0, 10, 20, 12];
let fruits = ["apple", "Orange", "orange", "melon"];
console.log(nums.sort(ascending_order));
console.log(fruits.sort(ascending_order))
- forEach()
- 배열 요소 별 콜백 함수 각각에 실행
- Array.forEach(function(item, index, array){})
- map()
- 배열 요소 별 함수 호출 및 결과를 배열로 반환
- Array.map(function(item, index, array){})
let nums = [1, 2, 3];
nums.forEach((v)=>console.log(v)); // output: 1 2 3
let new_nums = nums.map(v=>v*2);
console.log(nuew_nums); // output: [2, 4, 6]
- find()
- 콜백 함수의 조건을 만족하는, 단 하나의 값만 반환
- Array.find(function(item, index, array){})
- filter()
- 콜백 함수의 조건을 만족하는 값을 배열로 반환
- Array.filter(function(item, index, array){})
let users = [
{ name: "bob", age:17, job: false },
{ name: "alice", age: 20, job: false },
{ name: "john", age: 27, job: true }
];
let find_job = users.find((user) => user.job == false)
console.log(find_job); // output: { name: 'bob', age: 17, job: false }
let filter_job = users.filter((user) => user.job == false)
console.log(filter_job); // output: [{name: 'bob', age: 17, job: false}, {name: "alice", age:20, job: false}]
- 요소 별 함수 수행 누적 결과값 반환
- Array.reduce(function(accumulator, item, index, arary){})
let nums = [1, 2, 3, 4, 5];
let call_count = 0;
console.log("result\tvalue\tindex");
let sum = nums.reduce(function (accumulator, item, index, array) {
console.log(accumulator, "\t\t", item, "\t\t", index);
call_count++;
return accumulator + item;
}, 0); // initial 없다면 index 1부터 시작
/* output
result value index
0 1 0
1 2 1
3 3 2
6 4 3
10 5 4 */
console.log(call_count); // output: 5
console.log(sum); // output: 15
- some()
- 배열 내 단 하나라도 콜백 함수의 조건을 만족하는 요소가 있다면 true, 아니면 false 반환(빈 배열인 경우 false)
- Array.some(function(item, index, array){}), item: 배열 요소, index: 배열 위치, array: 배열
- every()
- 배열 내 모든 요소가 콜백 함수의 조건을 만족한다면 true, 아니면 false 반환(빈 배열인 경우 true)
- Array.every(function(item, index, array){}), item: 배열 요소, index: 배열 위치, array: 배열
/* 1. some() */
let users = [
{ name: "bob", age: 17, job: false },
{ name: "alice", age: 20, job: false },
{ name: "john", age: 27, job: true },
];
let some_job = users.some(function (user){
return user.job == false;
});
console.log(some_job); // output: true
let some_age = users.some(function (user){
return user.age < 16;
});
console.log(some_age); // output: false
let empty = [].some((item) => item > 16);
console.log(empty); // output: false
/* 2. every() */
let every_job = users.every(function (user){
return user.job == false;
});
console.log(every_job); // output: false
let every_age = users.every(function (user){
return user.age > 16;
});
console.log(every_age); // output: true
let empty = [].every((item) => item > 16);
console.log(empty); // output: true
- 배열(Array) 안에 N개 만큼의 배열이 존재하는 객체
- 2/3차원 지도 정보, RGB를 저장하는 2차원 사진 파일 등을 표현할 때 활용 가능
- 2차원 배열은 array[N][m]으로 접근하며, 배열(Array) 전체를 push(), pop() 가능
// 2차원 배열 예제
let array = [
[101, 102, 103],
[201, 202, 203],
[301, 302, 303],
];
console.log(array); // output: [[101, 102, 103], [201, 202, 203], [301, 302, 303]]
console.log(array[0]); // output: [101, 102, 103]
console.log(array[1][0]); // output: 201
console.log(array[2][2]); // output: 303
let arr_2 = array.pop();
console.log(array.length); // output: 3
console.log(arr_2); // output: [301, 302, 303]
console.log(array); // output: [[101, 102, 103], [201, 202, 203]]
let array_num = array.push([401, 402, 403]);
console.log(array.length); // output: 3
console.log(array_num); // output: 3
console.log(array); // output: [[101, 102, 103], [201, 202, 203], [401, 402, 403]]
// 2차원 배열 반복문 예제
let array = [[101, 102, 103], [201, 202, 203], [301, 302, 303]];
for (let i=0;i<array.length;i++){
for (let j=0;j<array[i].length;j++){
console.log(array[i][j]);
}
}
// output: 101 ... 303