Front-end/Js

Js 기초(array)- AWS 풀스택 과정 19일차

awspspgh 2024. 8. 8. 17:49

오늘은 array에 대해서 배워보겠습니다

 

목차
1. array
2. 예제 문제
3. 느낀 점

 

1. array

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>배열 : 자바 스크립트에서 배열은 유동 배열(크기, 데이터의 변경이 자유롭게 사용가능)</h1>
    <ul>
        <li>const myArray = [1,2,,'a','b',{}];</li>
        <li>
            배열에 데이터 타입은 제한이 없음.
            같은 타입으로 채우는 것이 룰
        </li>
        <li>
            배열의 사용 목적 : 관련있는 데이터를 묶어서 관리하기 위해
        </li>
        <li>myArray=[] : 초기값으로 빈 배열을 만든 후 데이터를 추가하여 사용</li>
        <li>index를 가짐 => 0부터 시작</li>
        <li>length => 배열의 총 길이</li>
    </ul>
    <script>
        const array = new Array(1,2,3); // 잘 사용하지 않음
        console.log(array);
        const myArray = [1,2,3,"a",'a',`a`]; // 일반적인 사용 방법
        console.log(myArray);

        // 배열의 요소를 출력
        console.log(myArray[0]);
        console.log(myArray[1]);
        console.log(myArray[myArray.length-1]); // 마지막 번지

        // 마지막 번지에 값을 추가
        myArray[myArray.length] = 6;
        console.log(myArray);
        myArray[9] = 10;
        console.log(myArray);
        // console.log(maArray[7]); // undefined -->

        // const로 선언한 배열은 배열안의 요소로 변경하는 것은 가능하지만,
        // 배열자체가 다른 배열로 바뀌는 것은 안 됨.
        // 만약 배열 자체의 교체가 필요한 작업이라면 let을 사용하여 선언해야 함.

        // myArray = ['a', 'b', 'c']; // const라서 불가능. -->
        console.log(myArray);

        console.log("------------");
        // myArray의 모든 값을 콘솔에 출력
        
        for(let i = 0; i < myArray.length; i ++){
            console.log(myArray[i]);
        }
        console.log("------------");
        // for of 사용
        for(let a of myArray){
            console.log(a);
        }

        console.log("------------");
        // 여러 가지의 데이터를 담고 있는 유사 배열 : 혼합 배열
        let associativeType = [1, true, 'hong', undefined, {k : 'value'}, ['k' , 'v']];
        for(let b of associativeType){
            console.log(b);
        }
    </script>
</body>
</html>

 

▷ 출력

 

◈ array method

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>배열 관련 메서드 : 유사 배열에서는 사용 제한이 되는 메서드들도 있음.</h1>
    <ul>
        <li>
            array.push(value) : 배열의 마지막에 value를 추가하여
            => 배열의 길이를 리턴
        </li>
        <li>
            array.pop() : 배열의 마지막 요소를 제거
            => 배열의 마지막 요소를 리턴
        </li>
        <li>
            array.shift() : 배열의 첫 요소를 제거 후 값을 리턴
            = pop()과는 위치가 반대 
        </li>
        <li>
            array.unshift(value) : 배열의 첫 요소로 value를 추가하여 => 길이를 리턴
        </li>
        <li>
            join(value) : 배열 사이에 value를 추가하여 문자열로 리턴
        </li>
        <li>
            split() : 특정 값을 기준으로 배열로 나눔.
        </li>
    </ul>
    <script>
        const ourClass = [];
        ourClass[ourClass.legth] = '홍길동';
        ourClass[ourClass.legth] = '김영이';
        ourClass[ourClass.legth] = '박철수';
        console.log(ourClass);
        ourClass.push('이순신');
        console.log(ourClass.push('강감찬'));
        console.log(ourClass.pop());  // 마지막 요소를 꺼내고 리턴
        console.log(ourClass.shift()); // 배열의 첫 요소를 제거
        console.log(ourClass.unshift('홍순이'));
        
        let str = ourClass.join(" / ");
        console.log(str);

        console.log(str.split(" / "));
        // ourClass = str.split(" / "); // const라서 불가능.
    </script>
</body>
</html>

 

▷ 출력

 

◈ sort

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>
        배열의 정렬은 문자 기반으로 정렬됨.
    </h1>
    <ul>
        <li>array.sort() : 문자를 기준으로 오름차순</li>
        <li>array.reverse() : 문자를 기준으로 내림차순</li>
        <li>
            정렬할 배열의 값이 숫자일 때
            콜백함수를 이용하여 내부 연산을 통해 정렬됨
        </li>
        <li>
            [1, 6, 3, 5, 8, 2]
            array.sort(function(a,b){
                return a-b; // 오름차순
                return b-a; // 내림차순
            })
        </li>
    </ul>
    <script>
        const myArray = ['apple', 'orange', 'banana', 'kiwi'];
        console.log(myArray.sort());
        console.log(myArray.reverse());

        const numArray = [];
        // 랜덤으로 1 ~ 10까지의 숫자를 5개 채우기
        let i = 1;
        while(i <= 5){
            let ran = Math.floor(Math.random()*10)+1;
            numArray.push(ran);
            i++;
        }
        console.log('--------------');
        console.log(numArray);

        // numArray를 정렬하여 콘솔에 출력
        numArray.sort(function(a,b){
           return a - b; // 오름차순 
        });
        console.log(numArray);
        
        // numArray를 내림차순 정렬하여 콘솔에 출력
        numArray.sort((a,b) => {   // 화살표 함수
           return b - a; // 내림차순 
        });
        console.log(numArray);
        console.log("-------------------");

        const cars = [
            {type: 'volvo', year: 2024},
            {type: 'banz', year: 2021},
            {type: 'bmw', year: 2023},
            {type: 'sonata', year: 2022}
        ];
        console.log(cars);
        // year을 기준으로 내림차순하여 정렬
        cars.sort(function(a, b){
            return b.year - a.year;
        });
        console.log(cars);

        // type을 기준으로 오름차순 정렬
        // -1 0 +1
        cars.sort(function(a,b){
            let x = a.type.toLowerCase(); // 소문자로 변경
            let y = b.type.toLowerCase();
            if(x > y){
                return 1;
            }
            if(x < y){
                return -1;
            }
            return 0;
        });
    </script>
</body>
</html>

 

▷ 출력

 

iteration

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>
        배열의 순환 구조를 이용하여 특정 기능을 수행하는 메서드
    </h1>
    <ul>
        <li>array.forEach(callback function) : 일반 반복문과 유사한 형태</li>
        <li>array.map(callback function) : forEach의 결과를 리턴하여 새로운 배열을 생성</li>
        <li>
            array.filter(callback function) : map처럼 수행하면서 비교 연산을 통해
            true 값만 필터링하여 리턴
        </li>
    </ul>
    <script>
        const numArr = [3,5,5,4,4,1,2,7,9,6,8];
        const strArr = ['a', 'g', 'h', 'b', 'c', 't', 'd'];

        console.log("forEach-- value, index, array --");
        numArr.forEach(function(v, i, a){
            console.log(v, i, a);
        });
        strArr.forEach(function(v, i, a){
            console.log(v, i, a);
        })

        console.log("-- value, index --")
        // index value
        numArr.forEach(function(v,i){
            console.log(i, v);
        });

        // value
        strArr.forEach(function(v){
            console.log(v);
        });

        // invoke callback function
        function printNumber (v, i, a){
            console.log(i, v, a);
        }
        console.log("---------------");
        console.log("invoke callback function");
        numArr.forEach(printNumber);  //callback function을 호출할 때는 ()없애고 호출

        console.log("-- map() callback function --");
        const newStrArr = strArr.map(function(v, i){
            return `${i}, ${v}`;
        });
        console.log(newStrArr);
        const newStrArr2 = strArr.forEach(function(v, i){
            return `${i}, ${v}`; // forEach는 return 기능이 없음.
        })
        // console.log(newStrArr2); // undefined

        console.log("-- filter() --");
        // 5보다 큰 수만 배열로 리턴
        const newNumArr = numArr.filter(function(v){
            return v >= 5;
        });
        console.log(newNumArr);

        // 짝수만 배열로 리턴
        const newNumArr2 = numArr.filter(function(v){
            return v = v % 2 == 0;
        });
        console.log(newNumArr2);

        // filter를 활용한 배열의 중복 제거
        // 현재 요소가 이전에 등장하지 않은 경우만 true
        console.log(numArr);
        const onlyArr = numArr.filter((v,i,s)=>{
            return s.indexOf(v) == i;
        });
        console.log(onlyArr);
    </script>
</body>
</html>

 

▷ 출력

 

◈ iteration method

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>
        Array Iteration Method : 순환 구조에서 사용하는 메서드
    </h1>
    <ul>
        <li>
            array.reduce(callback function(total, value, index, self), [init value]);
            누적값을 리턴
        </li>
        <li>
            array.every(callback function(value, index, self));
            콜백 리턴 조건에 모든 배열의 값이 만족하면 true / false를 리턴
        </li>
        <li>
            array.some(callback function(value, index, self));
            콜백 리턴 조건에 하나의 값이라도 만족하면 true / false를 리턴 ( || )
        </li>
        <li>
            array.indexOf('str', [start index]);
            해당 문자열이 배열에 존재하면 index를 리턴
        </li>
        <li>array.lastIndexOf('str', [start index]); 뒤에서부터 탐색</li>
        <li>
            array.find(callback function(value, index, self));
            리턴 조건에 만족하는 첫 값을 리턴
        </li>
        <li>
            array.findIndex(callback function(value, index, self));
            리턴 조건에 만족하는 첫 값의 index을 리턴    
        </li>
        <li>array.form('객체') : 순서가 있거나, 순환 구조를 갖고 있는 객체를 배열로 변환</li>
        <li>
            array.keys() : 배열이 사용중인 key(index)를 검색하여 새로운 배열로 리턴
        </li>
        <li>
            array.enterties() : index:value의 구조값을 만들어서 새로운 배열로 리턴
        </li>
        <li>
            array.includes("str") : 배열에 str 값이 있으면 true / false
        </li>
    </ul>
    <script>
        const fruits = ["apple", "banana", "orange", "apple", "mango"];
        let f = fruits.entries();
        console.log(f);
        for(let a of f){
            console.log(a);
        }

        let find = fruits.indexOf('apple', 1);
        console.log(find);

        console.log(fruits.includes("banana"));

        const arr = [2,4,5,7,9,30,6];
        const sum = arr.reduce(function(total, v){
            return total + v;
        }, 1000);
        console.log(sum);

        let find1 = arr.find(function(v){
            return v >= 10;
        });
        console.log(find1);

        console.log(arr.findIndex((v)=>{
            return v >= 10;
        }));

        let even = arr.every((e)=>{
            return e % 2 == 0;
        });
        console.log(even);

        // 콜백 함수의 내용이 return 하나 밖에 없다면 return 생략 가능. { } 같이 제거
        let even2 = arr.every((e)=> e % 2 == 0 );
        console.log(even2);

        // 파라미터가 하나밖에 없을 경우 () 생략가능
        let even3 = arr.every(e=>{ return e % 2 == 0 });
        console.log(even3);
    </script>
</body>
</html>

 

▷ 출력

 

▣ 필터링

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const student = [
            {name: 'hong', age: 23},
            {name: 'kim', age: 25},
            {name: 'lee', age: 30},
            {name: 'pack', age: 28},
            {name: 'choi', age: 22}
        ];

        // 나이가 25세 이상인 데이터만 필터링하여 출력
        const Age = student.filter(function(v){
            return v.age >= 25;
        });
        console.log(Age);
        // 이름의 길이가 3글자인 학생만 필터링하여 출력
        const Name = student.filter(function(v){
            return v.name.length == 3;
        });
        console.log(Name);
    </script>
</body>
</html>

 

▷ 출력

 

2. 예제 문제

◎ 문제

▶ 1번

    <!-- 
        input에 파일명.확장자 형태로 입력을 하여 버튼을 클릭하면
        이미지 파일인지 아닌지 검사
        이미지 파일이면 '정상 파일입니다.'(green)
        이미지 파일이 아니면 '이미지 파일만 가능합니다.'(red)
        이미지 파일 jpg(JPG), jpeg(JPEG), png(PNG), gif(GIF) 대소문자 가능.
    -->

 

▷ 출력

 

▶ 2번

 

◎ 정답

▶ 1번

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .green{
            color: green;
        }
        .red{
            color: red;
        }
    </style>
</head>
<body>
    <!-- 
        input에 파일명.확장자 형태로 입력을 하여 버튼을 클릭하면
        이미지 파일인지 아닌지 검사
        이미지 파일이면 '정상 파일입니다.'(green)
        이미지 파일이 아니면 '이미지 파일만 가능합니다.'(red)
        이미지 파일 jpg(JPG), jpeg(JPEG), png(PNG), gif(GIF) 대소문자 가능.
    -->
        파일명 : <input type="text" id="fileName"><br>
        <button type="button" id="btn">확인</button>
        <h3 id="result"></h3>

        <script>
            document.getElementById('btn').addEventListener('click', ()=>{
                let fileName = document.getElementById('fileName').value;
                let result = document.getElementById('result');
                console.log(fileName);
                
                const name = ['.jpg', '.jpeg', '.png', '.gif'];
                console.log(name);

                let str = '';
                if(name.includes(fileName.substring(fileName.lastIndexOf('.')).toLowerCase())){
                    str += '<span class="green">정상 파일입니다.</span>';
                }else{
                    str += '<span class="red">이미지 파일만 가능합니다.</span>';
                }
                result.innerHTML = str;
            });
        </script>
</body>
</html>

 

▶ 2번

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button onclick="play(1)"><img src="../image/scissors.png" alt=""></button>
    <button onclick="play(2)"><img src="../image/rock.png" alt=""></button>
    <button onclick="play(3)"><img src="../image/paper.png" alt=""></button>
    <h3 id="h3"></h3>

    <script>
        let h3 = document.getElementById('h3');
        // 누적이 되어야하는 점수
        let count = 1;
        let win = 0;
        let drow = 0;
        let lose = 0;

        // 승패 결정
        function play(player){
            let com = Math.floor(Math.random()*3)+1;
            str = ``;                                 // Html 출력값 초기화
            if((player == 1 && com == 3) || (player == 2 && com == 1) || (player == 3 && com == 2)){
                win ++;
                str += `player : ${change(player)} / com : ${change(com)} => player가 이겼습니다.<br>`
            }else if(player == com){
                drow ++;
                str += `player : ${change(player)} / com : ${change(com)} => player가 비겼습니다.<br>`
            }else{
                lose ++;
                str += `player : ${change(player)} / com : ${change(com)} => player가 졌습니다.<br>`
            }
            
            printResult();
            count ++;
        }

        // 숫자 => 문자 출력
        function change(n){
            if(n == 1){
                return `가위`;
            }else if(n == 2){
                return `바위`;
            }else if(n == 3){
                return `보`;
            }else{
                return `오류`;
            }
        }

        // 출력
        function printResult(){
            str += `현재 전적<br>`;
            str += `승 : ${win} / 무 : ${drow} / 패 : ${lose}<br>`;
            let check = count - drow;
            if(count - drow == 0){                                      // 0으로 나누기 방지
                check = 1;
            }
            str += `승률 : ${(win / (check)*100).toFixed(2)}%`;
            h3.innerHTML = str; 
        }
    </script>
</body>
</html>

 

3. 느낀 점

array에 활용할 수 있는 용어들이 많았고 콜백 함수를 부르는 과정이 복잡해서 이해하기 어려웠던 것 같다. 그렇기에 array 부분을 예제 문제들을 풀어보면서 복습을 해야 할 것 같다.