> Hello World !!!

     

@syaku

자바스크립트 배열 과 정렬 : JavaScript Array Sort , Queue

written by Seok Kyun. Choi. 최석균

 자바스크립트 배열 관하여...

배열에 관해 포스트를 하게된 이유는 개발 도중 배열이 정적이라는 것을 알게 되었기 때문이다. 이유는 잘 모르겠지만, 왜 배열로 선언된 변수를 새로운 변수에 담고 다르게 정렬하게 되면 두 변수가 동일한 결과를 가져오는 것이다. Why? 알려주세요 ㅡ.ㅜ;
과정은 이렇다.

배열A = 1 , 2 , 3
배열B = 배열A

배열A = 큐정렬(배열A) // 결과 2 , 3,  1

배열A // 2 , 3 , 1
배열B // 2 , 3 , 1

왜 이런 결과과 나오는 것인가? 분명 배열 큐정렬은 배열A에 대입했는 데. 배열B의 결과도 동일하게 변화가 생긴다.
내 생각은 메모리에 할당되어 같은 주소를 가져오기 때문이라 생각든다만,,,

해결법은 새로운 배열을 만들어주어야 한다. 그래서 배열 내장객체인 slice 사용하면된다. slice(시작[,끝])


 예제

var objA = [ 1 , 2 , 3 ];
var objB = objA;

document.writeln(objA.join(',')); // 1 , 2 , 3
document.writeln(objB.join(','));  // 1 , 2 , 3

objA = queue(objA);

document.writeln(objA.join(','));
document.writeln(objB.join(','));

queue 함수에 slice 내장객체를 사용하면
objA 는 2 , 3 , 1 되고, objB 1 , 2 , 3 된다.

slice 내장객체 사용하지 않으면
objA 와 objB 는 2 , 3 , 1 이란 결과를 얻는 다.

 큐 정렬 함수

/**
 * programmed by Seok Kyun. Choi.
 * http://syaku.tistory.com
 */

function queue(obj) {
  obj = obj.slice(0); // slice 객체를 써주는 것과 안써주는 것의 차이 이다.
  var cnt = obj.length;
  if (cnt <= 1) { return obj; }
  
  var last = obj[0];
  var first = obj[1];
  for (var i = 0; i < cnt; i++) {
    if (i == 0) {
      obj[0] = first;
    } else if (i == (cnt - 1)) {
      obj[cnt - 1] = last;
    } else {
      obj[i] = obj[i+1];
    }
  }

  return obj;
}

 정렬 함수

/**
 * programmed by Seok Kyun. Choi.
 * http://syaku.tistory.com
 */

// 선택한 인덱스를 기준으로 큐정렬된다.
function sort(obj,index) {
  index = parseInt(index);

  var obj = obj.slice(0);
  var cnt = obj.length;
  if (cnt <= 1) { return obj; }

  var first = obj[index];
  var ret = [];
  
  ret[0] = first;

  var num = index;
  if (cnt <= 1) { return obj; }
  for (var i = 1; i < cnt; i++) {
    num++;
    if (num >= cnt) {
      num = 0;
    }
    ret[i] = obj[num];
  }

  return ret;
}

posted syaku blog



http://syaku.tistory.com