배열이란 여러개의 값을 순차적으로 나열한 자료구조이다. 배열은 요소들의 위치를 나타내는 인덱스와 배열의 크기를 알려주는 length프로퍼티를 갖기때문에 순차적으로 혹은 역순으로 요소에 접근할 수 있을 뿐만 아니라 특정요소를 직접 바꿀 수 있다.
위 특징들을 갖고 있는배열을 이용하면 한 배열에 많은 요소들을 저장할 수 있을 뿐만이 아니라 원하는 요소들에 쉽게 접근할 수 있기 때문에 배열이 필요하고 잘 다룰 줄 아는 것이 중요하다.
const arr = [1, 2, 3, 4, 15, 16, 17, 5, 6, 7];
arr.splice(4, 3);
4번째 요소부터 3개를 지움
const arr = [1, 2, 3, 14, 15, 16, 7, 8];
arr.splice(3, 3, 4, 5, 6);
3번째 요소부터 3개를 지우고 4 5 6을 추가함
arr.splice(-3) 인덱스 값을 음수로 지정하여 -3이면 뒤에서 세개를 지운다.
const arr = [1, 2, 3, 14, 15, 16, 7, 8];
arr.splice(-3);
arr.length로 배열의 요소들이 몇개가 있는지를 확인할 수 있다.
반복문과 함께 사용해서 많이 활용한다.
배열이 두개 있을 때 인수로 전달된 배열을 원본배열의 마지막에 추가해서 반환한다.
'원본배열.concat(추가할 배열)'
원본배열을 변경하지 않는다. 고로 값을 추후에 쓰려면 새로운 배열에 저장해두어야 한다.
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const Newarr = arr1.concat(arr2);
지정한 범위의 배열을 복사해 새로운 배열로 반환한다.
'원본배열.slice('복사를 처음 시작할 index','복사를 종료할 다음 index')'
두번째 인자가 6이라면 다섯 번째 인수까지 반환한다. 처음 시작 index가 음수라면 배열의 끝에서부터 참조한다.
원본배열을 변경하지 않는다.
다음과 같이 arr[5]는 반환하지 않고 직전 요소인 arr[4]까지 반환하여 저장한다.
filter함수는 콜백함수를 만들어 반환값이 true인 요소들로만 구성된 새로운 배열을 반환한다.
filter함수는 인수로 (요소값, 인덱스, this) 이렇게 세개를 전달한다.
const number = [1, 2, 3, 4, 5];
const odds= number.filter(aaa => aaa % 2 ==1 );
함수의 배열을 거꾸로 뒤집는다. 이때 원본 배열을 변경한다.
const arr = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
arr.reverse();
특정 요소가 포함되어 있는지 확인하여 true 또는 false를 반환한다.
const arr = ['orange', 'grapes', 'apple'];
값을 반환하기 때문에 console.log로 확인해야 결과값이 보인다
arr.includes('grapes'); //true
arr[0].includes('or'); //true(원소들이 다음 문자열을 포함하고 있는지도 사용가능)
arr.includes('banana'); //false
원본배열에서 인수로 전달된 요소를 검색하여 첫 번째로 검색된 요소의 인덱스를 반환한다.
인수가 없으면 -1을 반환한다.
값을 반환하기 때문에 console.log로 확인해야 결과값이 보인다
const arr = [1, 2, 3, 4];
arr.indexOf(2) // 1
arr.indexOf(5) // -1
배열안에 한개 이상의 배열이 또 존재하는 배열을 고차배열이라고 한다.
const arr = [[1, 2, 3, 4], [5, 6], [7, 8, [9, 10]]]
기존에 배열에 접근하는 방식으로 접근하면
arr[0]은 [1, 2, 3, 4]
arr[1]은 [5, 6]
arr[2]는 [7, 8, [9, 10]]
다음과 같이 반환한다.
배열 안의 배열의 요소에 접근하려면
arr[0][3] 이런식으로 써주면 arr의 첫번째 배열안의 네번째 요소에 접근 할 수 있다.
flat함수는 배열 안의 배열을 평탄화 한다.
함수안의 인자는 평탄화할 깊이를 정한다.
함수의 원본배열을 바꾸지 않는다.
같은 동작을 하는 코드를 반복문을 통해 효율적인 코드로 작성할 수 있다. 코드의 효율성이 올라가고 유지보수가 쉽다. 이러한 이유로 반복문을 적절한 때에 잘 써주는 것이 매우 중요하다.
for 반복문은 다음과 같이 쓴다.
```
for('counter의 초기상태'; '코드를 실행할 조건'; 'counter의 변화'){
'수행할 동작'
};
for(i=0; i<10; i++){
console.log(i)
};
```
밑의 코드의 결과로 0부터 9까지를 출력한다.
배열은 인덱스와 길이 값을 갖고있다. 때문에 for문을 통해 순차적으로 요소에 접근할 수 있다.
배열안의 객체에 접근해서 필요한 값만 따로 저장하는 문제로
다음 배열에서 level이 'hard'인 것을 찾아 따로 배열로 저장하는 문제.
let courses = [
{ level: 'easy', subject: "English" },
{ level: 'hard', subject: "Mathmatic" },
{ level: 'medium', subject: "Literature" },
{ level: 'hard', subject: "Science" },
{ level: 'medium', subject: "Socialogy" }
];
다음과 같이 배열이 있다.
새로운 배열을 만들고 filter 함수를 통해 객체의 요소에 접근하여 true값을 반환하게 해야하는데 객체의 특정 요소에 접근하는 방법이 매우 어려웠다. 우선 배열안의 객체에 먼저 접근하여 객체 안에서 또 원하는 값을 확인해야 했다.
console.log(courses[1].subject
다음과 같이 두 번째 객체의 과목은 수학임을 알 수 있다.
그럼 새로운 배열을 선언하고 원본배열에 filter함수를 사용하여 레벨이 'hard'인 객체들에만 true값을 나오게 해줘야 한다.
이 객체안에 다시 접근하기 위해서 함수의 인덱스를 받아야해서 filter함수에 인수를 두개를 써야하는데,,, 이걸 몰라서 한참을 헤맸다..
const NewArr = courses.filter((o, i) => courses[i].level == 'hard');
courses의 i번째 인덱스를 갖고 있는 객체의 level값이 'hard'이면 true를 반환하기에 새로운 배열에 저장한다.
console.log(NewArr)을 실행하면
다음과 같이 잘 나온다.
let pasta = ['tomato', 'basil', 'onion','chicken'];
let pizza = ['tomato', 'cheese', 'onion','olive','beef'];
다음과 같이 재료들이 있다. concat으로 합치고 중복된 요소들을 제거하는 문제였다.
indexOf와 filter함수를 사용하라고 친절하게 설명까지 쭉 써줬지만,, 어떤 원리로 중복이 제거되는지 이해가 잘 되지 않아서 한참 헤맸다.
일단 이해한 원리는 indexOf는 첫번째로 검색한 요소들만 index를 반환한다. 즉 모든 요소를 집어넣어서 indexOf로 확인을 해도 처음 index만 반환하기에 반환한 것들을 바로저장을 해도 두번째 요소들은 반환을 하지 않기에 저장을 할 수가 없다.
filter함수와 동시에 사용을 해서 써보면
const Arr = pasta.concat(pizza);
다음과 같이 나오고 위에서 중복을 제거해주면 된다.
const NewArr = Arr.filter((value, index)=>
arr.indexOf(value)===index);
arr[index]의 index와 arr.indexOf(value)의 값이 같으면 true를 반환하기에 filter함수에서 새로운 배열에 저장을 할 것이다.
다섯 번째 요소를 검사할 때
arr[5]의 인덱스 값은 5이다. 하지만 indexOf("tomato")가 첫번째 토마토를 반환하기에 이 값은 0이 된다. 따라서 뒤의 토마토는 새로운 배열에 저장하지 못 할 것이다.
다음과 같은 문제다. 문제는 친절하게 배열과 예상되는 출력물까지 주어졌으나 문제를 풀어야 할 script에는 배열하나 주어지지 않고,, 어떠한 배열에나 공통으로 적용되는 함수를 짜야해서 당황스러웠다. ㅎㅎ...
우선 어떠한식으로 풀어야 할지 접근할때 이중배열을 for문으로 어떤식으로 접근하는지 친절하게 알려줬고
if문으로 만약 배열의 몇 번째 요소가 곰팡이라면 제거한다.
splice를 통해 몇번째 요소를 지울 건지 정해야 하는데 곰팡이 하나만 지울 것이므로 두번째 인수는 무조건 1
arr[1][2]를 제거하려면 arr[1].splice[2, 1]을 하면 그 요소가 바로 지워진다.
for(i = 0; i <arr.length; i++){
for( j = 0; j < arr[i] ; j++{
arr[i][j] == '곰팡이' ? arr[i].splice(j, 1) : null ;
}
};
단순히 두개만 비교하는 것은 삼항연산자가 if문보다 편해서 삼항연산자를 많이 쓴다.
arr[i][j] == '곰팡이'이면 그 요소를 지워야한다.
arr[i].splice[j, 1]로 지울 수 있다. 원본배열을 직접 변경하므로 따로 배열을 다시 저장해줄 필요는 없다.