Array
배열 선언
let o1 = [1.1, true, "a"];
----------------------------------
let o2 = [
[1, { x: 1, y: 2 }],
[2, { x: 3, y: 4 }],
];
----------------------------------
let a = [1,2,3]
let b = [0, ...a, 4];
----------------------------------
let original = [1, 2, 3];
let copy = [...original];
----------------------------------
let c = new Array(5, 4, 3, 2, 1, "testing, testing");
----------------------------------
Array.of(1, 2, 3);
----------------------------------
let original = [1, 2, 3];
let copy = Array.from(original);
- 비교적 아주 자유롭게 배열을 선언할 수 있다. 배열도 그냥 property를 가진다고 생각하면 편하다. 따라서 아주 이상한 값들도 인덱스가 될 수 있다(-값이든 뭐든)
Iterable한 속성을 가진다.
let digits = [..."0123456789ABCDEF"];
digits;
------------
let letters = [..."hello world"];
[...new Set(letters)];
- 이터러블한 속성을 통해 이런식으로 하나하나 분리해서 새로운 배열을 만들 수 있다.
인덱스값이 엄청 자유롭다.
o[1] = "one";
o["1"];
-
a[-1.23] = true;
a["1000"] = 0;
a[1.0] = 1;
- 그냥 객체의 프로퍼티처럼 생각하면 편하다. 뭐든 다 된다.
length..
let a = new Array(5);
a = [];
a[1000] = 0;
let a2 = [undefined];
--
a = [1, 2, 3, 4, 5];
a.length = 3;
- 배열은 길이를 함부로 조절하면 그만큼 없어져버린다.
for/of 반복문
let letters = [..."Hello world"];
let string = "";
for (let letter of letters) {
string += letter;
}
string;
entries() 메소드
let letters = [..."Hello world"];
let everyother = "";
for (let [index, letter] of letters.entries()) {
if (index % 2 === 0) everyother += letter;
}
everyother;
- entries()를 사용하면, 값 뿐만 아니라 인덱스도 뱉어준다.
forEach() (정말 중요하다)
let letters = [..."Hello world"]
let uppercase = ""
letters.forEach((letter) => {
uppercase += letter.toUpperCase();
});
uppercase;
- forEach()는 인자로 함수를 받는다. 이때 함수는 계속 쓸 것이 아니니까 굳이 정의해서 사용하지 않아도 된다. 그리고 화살표함수를 사용해서 써도 된다.
forEach() 연장선 (v, i, a)
let data = [1, 2, 3, 4, 5],
data.forEach(function (v, i, a) {
console.log(v, i, a);
a[i] = v + 1;
});
- (v, i, a)는 (값, 인덱스, 전체 배열)을 반환한다.
정규표현식
let letters = [..."Hello world"];
let vowels = "";
for (let i = 0; i < letters.length; i++) {
let letter = letters[i];
if (/[aeiou]/.test(letter)) {
vowels += letter;
}
}
vowels;
- 특정한 형태나 규칙을 가진 문자열을 찾아내기 위해서 패턴을 정의한다.
map()
let a = [1, 2, 3];
let b = a.map((x) => x * x);
- 값 하나하나를 가져다가 조건에 맞는 새로운 배열을 반환한다.
filter()
let a = [5, 4, 3, 2, 1];
let b = a.filter((x) => x < 3);
-
let c = a.filter((v, k) => {
console.log("value", v, "index", k);
return k % 2 === 0;
});
-
let d = a.filter((v, k) => k % 2 === 0);
- 특정 조건을 함수로 안에다가 줘서 새로운 배열을 반환한다.
reduce()
let a = [1, 2, 3, 4, 5];
a.reduce((x, y) => x + y, 0);
a.reduce((x, y) => x * y, 1);
a.reduce((x, y) => (x > y ? x : y));
- 조건과 시작 인덱스에 따라서 쭉쭉 살펴보면서 하나의 값을 반환한다. reduceRight()는 상위 인덱스에서 시작하는 점이 다름.
flat()
let a = [1, [2, [3, [4]]]];
a.flat(1);
a.flat(2);
a.flat(3);
a.flat(4);
- 다차원 배열을 인덱스값에 따라서 차원을 줄여나간다.
flatMap()
let phrases = ["hello world", "the definitive guide"];
let words = phrases.flatMap((phrase) => phrase.split(" "));
words;
-
[-2, -1, 1, 2].flatMap((x) => (x < 0 ? [] : Math.sqrt(x)));
[-2, -1, 1, 2].map((x) => (x < 0 ? [] : Math.sqrt(x)));
- 배열을 펼침과 동시에 연산을 수행할 수 있는 메소드다.
- 두번째 예시의 경우 그냥 map()을 사용하면 공백을 제거할 수 없다.
flatMap()을 사용해서 공백을 지워버린다.
array도 Object의 일종이다..
let a = {};
let i = 0;
while (i < 10) {
a[i] = i * i;
i++;
}
a.length = i;
- Array에는 Object에는 없는 특징들이 존재한다.
특히 .length() 프로퍼티를 가진다는 점이 있다.