본문 바로가기

Web/Javascript

배열 스크립트

//
//     Array method library
//    by 행복한고니 (20041012)
//

// 배열에 검색한 값이 있으면 인덱스 번호를 리턴, 없으면 -1을 리턴
Array.prototype.search = function(val) {
     var len = this.length;
    
     for (var i=0; i < len; i++) {
             if (this[i] == val) return i;
     }
    
     return -1;
}

// search 메소드와 같으나 대소문자 구별안함
Array.prototype.isearch = function(val) {
     var len = this.length;

     if ((typeof val).toLowerCase() == 'string') val = val.toLowerCase();
     for (var i=0; i < len; i++) {
             if (typeof this[i] != typeof val) continue;
             if ((typeof val).toLowerCase() == 'string' && val == this[i].toLowerCase()) return i;
             else if (val == this[i]) return i;
     }
     return -1;
}

// 키 배열을 받아서 문자열 인덱스가 있는 객체를 반환한다.
// 만일 배열의 크기가 서로 맞지 않으면 빈 array가 반환된다.
// 리턴값은 object
Array.prototype.combine = function(keyArr) {
     if (this.length != keyArr.length) return [];
    
     var ret = {};
     for (var i=0; i < this.length; i++) ret[keyArr[i]] = this[i];
    
     return ret;
}

// 범위의 값을 포함하고 있는 배열 반환
Array.prototype.range = function(Low, High, Step) {
     var ret = [];
     var t1 = (typeof Low).toLowerCase();
     var t2 = (typeof High).toLowerCase();
    
     if (Step == undefined) Step = 1;
     if (!((t1 == 'number' || t1 == 'string') && t1 == t2)) return ret;
     if (t1 == 'string') { Low = Low.charCodeAt(0); High = High.charCodeAt(0); }

     for (var i=Low; i <= High; i+=Step) ret[ret.length] = (t1=='string')?String.fromCharCode(i):i;

     return ret;
}

// 배열의 각 요소에 같은 함수 적용
// 만약, funcName 이라는 함수가 있다고 하면, Array.walk(funcName)과 같이 사용한다.
// 함수의 첫번째 전달자에 값이, 두번째 전달자에 인덱스가 전달된다.
Array.prototype.walk = function(Func) {
     var len = this.length;
     for (var i=0; i<len; i++) {
             this[i] = Func(this[i], i);
     }
}

// 배열 정렬 순서를 거꾸로 한다.
// 사용자 함수를 지정하면 지정한 함수로 정렬한다.
Array.prototype.rsort = function(sortFunc) {
     if (sortFunc == undefined) this.sort();
     else this.sort(sortFunc);
     return this.reverse();
}

// 배열내에 존재하는 숫자를 모두 더한다.
Array.prototype.sum = function() {
     var ret = 0;
     for (var i=0; i<this.length; i++) {
             if((typeof this[i]).toLowerCase() == 'number') ret += this[i];
     }

     return ret;
}

// 현재 배열요소를 반환한다.
Array.prototype.current = function() {
     if (this._index > this.length) this._index = this.length;
     return this[this._index];
}

// 현재 배열요소의 이전요소로 포인터를 이동하고 이전요소를 반환한다.
Array.prototype.prev = function() {
     if (--this._index < 0) this._index++;
     return this[this._index];
}

// 현재 배열요소의 다음요소로 포인터를 이동하고 다음요소를 반환한다.
Array.prototype.next = function() {
     if (++this._index >= this.length) this._index--;
     return this[this._index];
}

// 배열의 처음 요소로 포인터를 이동하고 요소를 반환한다.
Array.prototype.first = function() {
     this._index = 0;
     return this[0];
}

// 배열의 마지막 요소로 포인터를 이동하고 요소를 반환한다.
Array.prototype.end = function() {
     this._index = this.length - 1;
     return this[this._index];
}

// 현재 키를 반환한다.
Array.prototype.key = function() {
     if (this._index < 0) this._index = 0;
     else if (this.length > 0 && this._index >= this.length) this._index = this.length - 1;
     return this._index;
}

Array.prototype._index = 0;


// n번 섞는다
Array.prototype.shuffle = function(n) {
var i, j, k;
var temp;

for (i = 0; i < n; i++) {
for (j = 0; j < this.length; j++) {
k = Math.floor(Math.random() * this.length);
temp = this[j];
this[j] = this[k];
this[k] = temp;
}
}
this._index = 0;
}