반응형

sort() 메소드는 배열을 원하는대로 정렬 후 정렬된 배열을 반환 한다.

sort() 메소드 사용예시

var alpha = ['d', 'e', 'c', 'a', 'f', 'b'];
alpha.sort();
console.log(alpha);

정렬 후 변경된 배열

 

배열.sort([compareFunction])

정렬하고자 하는 배열.sort()를 통하여 정렬이 가능하다.

데이터는 따로 복제되는것이 아닌 원 배열을 정렬하는 것이므로 주의하자.

compareFunction : 정렬 순서를 정의하는 함수이다.

compareFunction이 정의되지 않으면 요소를 문자열로 변환하고 유니코드 포인터 순서로 문자열을 정리한다.

compareFunction(a, b)이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬한다. 즉 a가 먼저 온다.

compareFunction(a, b)이 0을 반환하면 a와 b를 서로 변경하지 않는다.

compareFunction(a, b)이 0보다 큰 경우 b를 a보다 낮은 인덱스로 정렬한다.

 


 

숫자(Number)를 비교할 때는 빼기를 통해 정렬이 가능하다.

var num = [5,4,3,2,1];
num.sort(function(a, b){
	return a-b;
})
console.log(num);

빼기 연산을 통한 정렬

 

 

배열에 담긴 객체는 키값을 지정하여 정렬이 가능하다.

var products = [
  { name: 'pineapple', price: 6000 },
  { name: 'banana', price: 1800 },
  { name: 'apple', price: 3700 },
  { name: 'cherry', price: 4050 },  
  { name: 'mango', price: 4900 }
];

// price 기준으로 정렬
products.sort(function (a, b) {
  if (a.price > b.price) {
    return 1;
  }else if (a.price < b.price) {
    return -1;
  }
});
console.log(products);

price 기준 정렬

 

 

배열 인덱스 형태로도 접근하여 정렬이 가능하다.

var products = [
  { name: 'pineapple', price: 6000 },
  { name: 'banana', price: 1800 },
  { name: 'apple', price: 3700 },
  { name: 'cherry', price: 4050 },  
  { name: 'mango', price: 4900 }
];

// name 기준으로 정렬
products.sort(function (a, b) {
  if (a["name"] > b["name"]) {
    return 1;
  }else if (a["name"] < b["name"]) {
    return -1;
  }
});
console.log(products);

name 기준 정렬

 

 

2가지 조건으로 정렬하기 (else if 문을 추가하면 된다.)

var students = [
    {name : "이민우",  class : 2, kor : 79, math : 66, eng : 100, sci : 82},
    {name : "박영철",  class : 2, kor : 94, math : 87, eng : 80, sci : 91},
    {name : "박소미",  class : 3, kor : 66, math : 95, eng : 78, sci : 87},
    {name : "김철수", class : 3, kor : 100, math : 78, eng : 92, sci : 80},
    {name : "송소희",  class : 1, kor : 80, math : 50, eng : 92, sci : 95},
    {name : "이창민",  class : 3, kor : 85, math : 49, eng : 95, sci : 78},
    {name : "김민수", class : 1, kor : 55, math : 98, eng : 86, sci : 77},
    {name : "노홍철", class : 1, kor : 95, math : 88, eng : 48, sci : 95},
    {name : "최유린",  class : 3, kor : 87, math : 77, eng : 91, sci : 89},
    {name : "최희",  class : 2, kor : 69, math : 86, eng : 66, sci : 100},
    {name : "박유진",  class : 2, kor : 70, math : 100, eng : 88, sci : 100}
];

// 반별 정렬 후 이름별 정렬
students.sort((a, b) => {
  if (a.class > b.class) return 1;
  else if (a.class < b.class) return -1;
  else if (a.name > b.name) return 1;
  else if (a.name < b.name) return -1;
});
console.log(students);

반별 정렬 후 이름별 정렬

 

반응형
반응형

for in 반복문은 객체에 사용하여 객체 내부의 데이터와 키값들을 출력할 수 있다.

문법)

for(var 키값 in 객체){

}

 

사용 예제 - 배열 출력하기

var arr = [1,2,3,4,5];
for(i in arr){
  console.log("key &gt;"+i+"    arr["+i+"] &gt;"+arr[i]);
}

 

for in 배열 출력


 

사용 예제 - 객체 출력

var product = {
  name : "건조 망고",
  kind : "당절임",
  ingredient : "망고, 설탕, 메타중아황산나트륨, 치자황색소",
  origin : "필리핀"
}
for(i in product){
  console.log("key >"+i+"    product["+i+"] >"+product[i]);
}

for in 객체 출력

 


 

사용 예제 - 배열 객체 데이터 출력하기

var students = [
  {name : "이민우",  class : 2, kor : 79, math : 66, eng : 100, sci : 82},
  {name : "박영철",  class : 2, kor : 94, math : 87, eng : 80, sci : 91},
  {name : "박소미",  class : 3, kor : 66, math : 95, eng : 78, sci : 87},
  {name : "김철수", class : 3, kor : 100, math : 78, eng : 92, sci : 80},
  {name : "송소희",  class : 1, kor : 80, math : 50, eng : 92, sci : 95},
  {name : "이창민",  class : 3, kor : 85, math : 49, eng : 95, sci : 78},
  {name : "김민수", class : 1, kor : 55, math : 98, eng : 86, sci : 77},
  {name : "노홍철", class : 1, kor : 95, math : 88, eng : 48, sci : 95},
  {name : "최유린",  class : 3, kor : 87, math : 77, eng : 91, sci : 89},
  {name : "최희",  class : 2, kor : 69, math : 86, eng : 66, sci : 100},
  {name : "박유진",  class : 2, kor : 70, math : 100, eng : 88, sci : 100}
];
for(i in students){
  for(j in students[i]){
      console.log("key >"+j+"    students["+i+"]["+j+"] >"+students[i][j]);
  }
}

배열 객체 데이터 출력

반응형
반응형

javascript(jquery)를 활용하여 재생, 일시정지, 멈춤 기능이 있는 스탑워치를 만들어 보겠다.

시간은 시 분 초만 표시한다.

스톱워치

1. 재생버튼은 시작한다.

2. 일시정지 버튼은 잠시 멈추는 기능으로 재생버튼을 다시 누르면 기존 시간을 이어서 진행한다.

3. 멈춤 버튼은 스톱워치를 초기화하고 정지시킨다.

 

아래는 실제 동작 스톱워치이다.

 

00:00:00

 

 

 

 

index.html

<!DOCTYPE html>
<html>
<head>
<style>
	*{
		margin: 0px;
		padding: 0px;
	}
  	body{
		height: 100vh;
		display: flex;
		flex-direction: row;
		align-items: center;
		justify-content: center;
 	}
 	.box{
		width: 200px;
		height: 200px;
	}
	.timerBox{
		width: 200px;
		outline: 2px solid black;
	}
	.timerBox .time{
		font-size: 30pt;
		color: #4C4C4C;
		text-align: center;
		font-family: sans-serif;
	}
	.btnBox{
		margin: 20px auto;
		text-align: center;
	}
	.btnBox .fa{
		margin: 0px 5px;
		font-size: 30pt;
		color: #FAED7D;
		cursor: pointer;
	}
</style>
<meta charset="UTF-8">
<title>StopWatch</title>
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script type="text/javascript" src="stopwatch.js"></script>
</head>
<body>
	<div id='box' class="box">
		<div id='timerBox' class="timerBox">
			<div id="time" class="time">00:00:00</div>
		</div>
		<div class="btnBox">
			<i id="startbtn" class="fa fa-play" aria-hidden="true"></i>
			<i id="pausebtn" class="fa fa-pause" aria-hidden="true"></i>
			<i id="stopbtn" class="fa fa-stop" aria-hidden="true"></i>
		</div>
	</div>
</body>
</html>

버튼 이미지는 bootstrap cdn 이미지를 활용 하였다.

stopwatch.js

var time = 0;
var starFlag = true;
$(document).ready(function(){
  buttonEvt();
});

function init(){
  document.getElementById("time").innerHTML = "00:00:00";
}

function buttonEvt(){
  var hour = 0;
  var min = 0;
  var sec = 0;
  var timer;

  // start btn
  $("#startbtn").click(function(){

    if(starFlag){
      $(".fa").css("color","#FAED7D")
      this.style.color = "#4C4C4C";
      starFlag = false;

      if(time == 0){
        init();
      }

      timer = setInterval(function(){
        time++;

        min = Math.floor(time/60);
        hour = Math.floor(min/60);
        sec = time%60;
        min = min%60;

        var th = hour;
        var tm = min;
        var ts = sec;
        if(th<10){
        th = "0" + hour;
        }
        if(tm < 10){
        tm = "0" + min;
        }
        if(ts < 10){
        ts = "0" + sec;
        }

        document.getElementById("time").innerHTML = th + ":" + tm + ":" + ts;
      }, 1000);
    }
  });

  // pause btn
  $("#pausebtn").click(function(){
    if(time != 0){
      $(".fa").css("color","#FAED7D")
      this.style.color = "#4C4C4C";
      clearInterval(timer);
      starFlag = true;
    }
  });

  // stop btn
  $("#stopbtn").click(function(){
    if(time != 0){
      $(".fa").css("color","#FAED7D")
      this.style.color = "#4C4C4C";
      clearInterval(timer);
      starFlag = true;
      time = 0;
      init();
    }
  });
}
반응형
반응형

알고리즘 문제를 풀이해 보겠다.

1 ~ 입력받은 숫자까지 데이터를 배열에 담을 때, 홀짝별로 정렬되어 들어가는 배열을 만들 것이다.

조건이 배열을 한개만 사용해야 한다는 부분이 신기하여 작성하여 보았다.

1. 입력받은 숫자까지 배열에 담는다. ex) 6을 입력시 1, 2, 3, 4, 5, 6

2. 배열에 어떻게 넣든 상관은 없지만 나중에 호출시

홀수부터 시작이면 1, 3, 5, 2, 4, 6 으로 출력된다.

짝수부터 시작이면 2, 4, 6, 1, 3, 5 으로 출력시킨다.

3. 배열은 한 개만 선언하여 사용한다. 2개이상 사용금지!

 

재미있는 조건의 문제같아서 풀이해보았다. 더 신박한 풀이 방식이 있다면 피드백 부탁드립니다.

index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>홀짝</title>
    <script type="text/javascript" src="js-sipping.js"></script>
    <style media="screen">
      .inputData{
        width: 80px;
        height: 30px;
      }
      .button{
        width: 60px;
        height: 30px;
      }
    </style>
  </head>
  <body>
    <input type="number" id="inputData" class="inputData">
    <button type="button" class="button" name="button" onclick="sipping()">실행</button>
    <div id="outPut">

    </div>
  </body>
</html>

 

js-sipping.js

function sipping(){
  var num = document.getElementById("inputData").value;
  num = parseInt(num);
  if(num > 1){

    var arr = new Array();
    var half;
    var idx = 0;
    var orderBy = confirm("홀수 부터 정렬할까요?");

    if(orderBy){
      half = Math.ceil(num/2);
    }else{
      half = Math.floor(num/2);
    }

    for(i=1; i<num+1; i++){
      if(orderBy){

        if(i%2 == 0){
          arr[half] = i;
          half++;
        }else{
          arr[idx] = i;
          idx++;
        }
      }else{

        if(i%2 == 0){
          arr[idx] = i;
          idx++;
        }else{
          arr[half] = i;
          half++;
        }
      }
    }

  }else{

    alert("2이상부터 동작합니다.")
    return;
  }

  document.getElementById("outPut").innerHTML = arr;
}

 

작성 한 코드는 2이상부터 동작하도록 설정하였다.

짝부터 정렬한다고 가정하고

0번인덱스부터 차례대로 짝수값만 %연산자를 통해 집어넣고

배열길이의 절반위치부터 차례대로 홀수값만 입력하여 완성시키는 코드이다.

홀부터 정렬할경우엔 반대로 동작

입력값이 2, 4, 6 등의 짝수 값을 입력시엔 반값이 정확하므로 문제가 없지만

입력값이 3, 5, 7 등의 홀수 값을 입력하면 반값이 소숫점으로 나오므로 정렬순에 따라 올림 또는 버림이 필요했다.


 

ex) 7이 입력된 경우 부터 정렬하면 홀수의 시작 위치가 3이다.(길이의 반 값(3.5)을 내림을 해야함)

숫자 2 4 6 1 3 5 7
배열[인덱스] 0 1 2 3 4 5 6
숫자 2 4 6 1 3 5 7
배열[인덱스] 0 1 2 3 4 5 6

 

ex) 7이 입력된 경우 부터 정렬하면 짝수의 시작 위치가 4이다.(길이의 반 값(3.5)을 올림을 해야함)

숫자 1 3 5 7 2 4 6
배열[인덱스] 0 1 2 3 4 5 6

 

반응형