GameMaker강좌[GMS2]/GMS2기초강좌

[게임메이커 강좌-기초][GMS2] 배열 함수-필터링 함수

타락카얀 2024. 1. 1. 10:46
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

 

◈ 배열 필터링 함수

 

 

배열을 필터링하여 유효한 값으로 재구성하는 배열 함수들에 대해 알아봅시다.

 

▣ 주요 목록 ▣


   - array_any(array, function, [offset], [length]) : 배열의 1개 요소가 콜백 메서드의 조건(true)과 일치 여부
   - array_all(array, function, [offset], [length]) : 배열의 모든 요소가 콜백 메서드의 조건(true)과 일치 여부


   - array_reduce(array, function, [init], [offset], [length]) : 콜백 메서드에 따른 1개의 값을 얻을 때 사용
   - array_concat(array1, array2 [, array3, ... array_n]) : 함수의 인수 순서대로 배열들을 결합한 새 배열을 반환
   - array_union(array1, array2 [, array3, ... array_n]) : 모든 배열의 합집합인 새 배열을 반환(중복값 제거)
   - array_intersection(array1, array2 [, array3, ... array_n]) : 모든 배열들이 교차하는 새 배열을 반환


   - array_filter(array, function, [offset], [length]) : 배열의 필터링한 새 배열을 반환
   - array_filter_ext(array, function, [offset], [length]) : 배열을 필터링하여 적용하고 수정된 개수를 반환
   - array_copy_while(array, function, [offset], [length]) : 배열의 필터링한 새 배열을 반환
   - array_map(array, function, [offset], [length]) : 콜백 메서드를 기반으로 배열을 수정한 새 배열을 반환
   - array_map_ext(array, function, [offset], [length]) : 콜백 메서드를 기반으로 배열을 수정하고 수정된 개수를 반환


   - array_unique(array, [offset], [length]) : 중복 값이 제거된 새 배열을 반환
   - array_unique_ext(array, [offset], [length]) : 중복된 값을 제거 적용하고 수정된 요소의 개수를 반환


   - array_foreach(array, function, [offset], [length]) : 배열내 요소 중 배열, 또는 구조체를 수정


   - array_contains(array, value, [offset], [length]) : 배열에 값의 포함여부
   - array_contains_ext(array, values, matchAll, [offset], [length]) : 배열에 값의 일부, 또는, 전부 포함 여부


 

 

 

 

 

 

먼저 배열 함수에 콜백 메서드를 매개변수로 지정하여 호출하는 부분에 대해 잠깐 알아봅시다.

필터링에 사용되는 콜백 메서드 구성은 보통 아래와 같습니다.


     function(value, index)


     - value (element) : 현재 배열 값(요소)
     - index : 현재 배열 인덱스


콜백 메서드에 전달되는 인자는 두가지로 첫번째는 현재 배열의 요소, 두번째는 배열의 인덱스입니다.

 

예) 현재 배열의 값들 중 0보다 큰 수들로만 배열을 재구성하고자 할 때


    //콜백 메서드 작성
   var temp_func= function(value, index)

   {
   return (value>0); // 배열의 현재 인덱스 값이 0보다 크면 true를 반환, 아니면 false
   }



    //함수에 적용시
    my_array=[-5,10,1,0,-3,28];
    passed = array_filter(my_array, temp_func); //필터링할 콜백 메서드를 지정


각각의 배열 함수가 원하는 조건이 다른데, 기능에 따라 콜백 메서드는 true, false를 반환시켜야 할 수도 있고,

값을 반환시키거나 직접 수정을 지시해야 할 수도 있습니다.

배열 함수와 함께 콜백 메서드를 호출하면 지정한 배열 전체를 검사하면서 콜백 메서드를 기반으로한 유효한 배열로 재구성하게 됩니다.

간단하게 반복문 형태로 배열을 전체 검사하는 기능이라고 보시면 됩니다. 이후 배열 함수들의 내용을 참고하세요.

 

 

 

 


   array_any(array, function, [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백 메서드. true 또는 false를 반환하는 조건자 메서드.


   - [offset] : [선택사항]검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택사항]검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 주어진 배열의 1개 요소가 콜백 메서드의 조건(true)과 일치하는지 확인하는데 사용됩니다.

배열의 각 요소에 true 또는 false를 반환하는 조건자 메서드를 전달하여 이를 확인합니다.

조건자 메서드가 지정된 배열 범위의 요소 중 하나 이상에 대해 true를 반환하면, 이 함수는 true를 반환합니다.

 

   - 반환값 : Boolean(콜백 메서드가 true를 반환하는 요소가 배열에 있으면 true, 없으면 false)

 

예를 들어 과일 이름 문자열을 포함하는 배열이 있다고 합시다.

배열에 "사과"가 포함되어 있는지 확인해 봅시다.


   var _array =
   [
       "apple",
       "banana",
       "coconut",
       "dragonfruit"
   ]
   
   var _contains_apple = array_any(_array, function(_val, _ind)
   {
       return _val == "apple"
   });
   
   show_debug_message(_contains_apple); // prints 1 (true)


조건자 메서드 _contains_apple은 _val == "apple"인지 확인하고 결과를 반환(true 또는 false)합니다.

이것이 배열의 요소 중 하나에 대해 true 가 발생하면 array_any는 true를 반환합니다.

 

 

여기서 잠깐!

배열 함수들의 오프셋(offset)과 길이(length)는 기능에 따라 검사할 원본 배열의 범위를 지정합니다.

 

   ◎ [offset] : [선택사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.

                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

                    -1을 지정하면 배열의 끝, -2는 끝에서 2 번째 인덱스입니다.

 

   ◎ [length] : [선택사항] 검사할 요소의 개수입니다. 음수 값은 배열을 거꾸로 탐색합니다.

                     참고로 infinity 상수를 지정하면, 오프셋에서 배열의 끝까지 탐색할 수 있습니다.

 

오프셋(offset)은 지정 범위의 시작 인덱스이고, 길이(length)는 지정 범위의 길이를 지정합니다.

이 옵션들은 [선택사항]이라 지정하지 않아도 됩니다.

지정하지 않을 경우, 배열의 0부터 시작하여 전체를 검사합니다.

 

 

 

 


   array_all(array, function, [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백 메서드. true 또는 false를 반환하는 조건자 메서드.

   - [offset] : [선택사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 주어진 배열의 모든 요소가 콜백 메서드의 조건(true)과 일치하는지 확인하는데 사용됩니다.

배열의 각 요소에 true 또는 false를 반환하는 조건자 메서드를 전달하여 이를 확인합니다.

 

이 함수는 조건자 메서드가 지정된 배열 범위의 모든 요소에 대해 true를 반환하면 true를 반환하고,

하나라도 그렇지 않으면 false를 반환합니다.

 

   - 반환값 : Boolean (함수가 배열 또는 범위 내의 모든 요소에 대해 true를 반환했는지 여부)

 

예를 들어, 배열의 모든 값이 짝수로 구성되었는지 확인한다고 합시다.


   values = [2, 4, 8, 10, 12, 14, 18, 22, 46];
   
   function is_even(element, index)
   {
       return (element mod 2 == 0);
   }
   
   var all_elements_are_even = array_all(values, is_even);


위의 코드는 값이 짝수이면 true를 반환하는 함수 is_even을 조건자 메서드를 정의합니다.

배열에서 array_all을 호출하고 결과를 임시 변수 all_elements_are_even에 저장합니다.

배열의 모든 값이 짝수이므로 all_elements_are_even이 true로 설정됩니다.

 

 

 

 


   ● array_reduce(array, function, [init], [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백함수


   - [init] : [선택사항] 콜백 메서드에 사용할 첫 번째 매개변수에 대응하는 초기 값입니다
               (첫 번째 반복에서 사용되고, 다음은 이전 인덱스 값으로 대체됨).
               아무것도 제공되지 않으면 기본값은 array[offset] 값이고, 첫 번째 반복은 건너뜁니다.

   - [offset] : [선택사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 모든 배열 요소를 하나씩 처리하여 배열 값들 중에서 콜백 메서드의 조건에 따른 1개의 값을 얻을 때 사용됩니다.

 

※ [참고] 콜백 메서드에는 이전 인덱스 값, 현재 인덱스 값, 배열 인덱스를 제공합니다.

 

   - 반환값 : 모든 요소

 

예들 들어, 배열에서 가장 작은 값을 찾아봅시다.


   var _array = [2, 1, 3, 4, 5];
   
   var _min_value = function(_previous, _current, _index)
   {
       return min(_previous, _current);
   }
   
   var _value = array_reduce(_array, _min_value);


먼저 임시 배열 배열을 만들고 일련의 숫자로 채웁니다.

그런 다음 이전 또는 현재 인수 중 더 작은 값을 반환하는 콜백 메서드 min_value를 생성합니다.

마지막으로 _min_value를 콜백 메서드로 사용하여 배열에서 array_reduce를 호출하고 최종 결과 1개를 임시 변수 값에 저장합니다.

이 변수는 배열에서 가장 작은 값인 1을 저장하겠죠.

 

 

 

 


   ● array_concat(array1, array2 [, array3, ... array_n])

   - array1 : 연결할 첫 번째 배열
   - array2 : 연결할 두 번째 배열

   - [array3, ... array_n] : [선택사항] 연결할 추가 배열


이 함수는 여러 배열을 인수로 사용하여 함수의 인수 순서대로 결합한 새 배열을 반환합니다.

 

   - 반환값 : Array

 


   array_1 = [1, 2, 3];
   array_2 = [4, 5, 6];
   array_3 = [7, 8, 9];
   
   new_array = array_concat(array_1, array_2, array_3);


위의 코드는 먼저 array_1, array_2 및 array_3의 세 가지 배열을 만듭니다.

그런 다음 array_concat을 사용하여 배열을 결합하고 결과를 new_array에 저장합니다.

 

 

 

 

 


   ● array_union(array1, array2 [, array3, ... array_n])

   - array1 : 연결할 첫 번째 배열
   - array2 : 연결할 두 번째 배열

   - [array3, ... array_n] : [선택사항] 연결할 추가 배열


이 함수는 모든 배열의 합집합인 새 배열을 반환합니다.

합집합은 중복값을 제거한 배열의 모든 요소를 나타냅니다.

 

※ [참고] 새 배열의 요소 순서는 정렬되지 않습니다. 배열을 정렬해야 하는 경우 나중에 정렬해야 합니다.

 

   - 반환값 : Array

 


   a1 = [1, 2, 3, 4, 5];
   a2 = [3, 4, 5, 6, 7, 8];
   a3 = [5, 6, 7, 8, 9, 10, 11];
   
   a4 = array_union(a1, a2, a3);


위의 코드는 먼저 3개의 배열 a1, a2 및 a3을 생성합니다.

그런 다음 중복값을 제거한 배열의 합집합 결과를 새 배열 a4에 저장합니다.

 

 

 


   ● array_intersection(array1, array2 [, array3, ... array_n])

   - array1 : 연결할 첫 번째 배열
   - array2 : 연결할 두 번째 배열

   - [array3, ... array_n] : [선택사항] 연결할 추가 배열


이 함수는 제공한 모든 배열들이 교차하는 새 배열을 반환(교집합)합니다.

이 함수는 또한 교차점에서 발견된 모든 중복 항목을 제거하므로 고유한 값만 반환합니다.

 

※ [참고] 새 배열의 요소 순서는 정렬되지 않습니다. 배열을 정렬해야 하는 경우 나중에 정렬해야 합니다.

 

   - 반환값 : Array

 


   var _array1 = [1, 1, 2, 7, 12];
   var _array2 = [1, 2, 4, 5, 7];
   var _array3 = [1, 4, 5, 7];
   
   var _array_intersection = array_intersection(_array1, _array2, _array3);


위의 코드는 먼저 3개의 임시 배열 _array1, _array2 및 _array3을 생성합니다.

그런 다음 array_intersection을 호출하여 이 세 배열의 교차되는 값들로 새 배열을 만듭니다.

_array_intersection 배열은 세 배열에 일치하는 값인 [1, 7]로 구성될 겁니다.

 

 

 

 


   ● array_filter(array, function, [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백 메서드. true 또는 false를 반환하는 조건자 메서드.


   - [offset] : [선택 사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택 사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 배열(또는 배열의 범위)의 필터링한 새 배열을 반환합니다.

배열의 모든 요소에 대해 실행되는 콜백 메서드는 조건에 따라 true 또는 false를 반환해야 합니다.

콜백 메서드가 true를 반환하는 요소는 반환된 배열에 포함되며, false가 되는 요소는 무시됩니다.

 

기본적으로 함수는 전체 배열을 확인합니다.

선택적으로 오프셋 및 길이 인수를 제공하여 배열을 앞뒤로 순회하면서 배열의 일부를 확인할 수 있습니다.

 

※ [참고] array_filter와 유사한 기능을 가진 array_copy_while 는 콜백 메서드가 첫 번째 false 반환하면 실행이 즉시 중지됩니다.

즉, false 가 반환되기 전의 인덱스까지만 배열에 값을 포함합니다.

 

   ◎ 반환값 : Array

 

예를 들어, 배열에서 특정 조건에 일치하는 값들로 구성해봅시다.


   function passed_the_test(element, index)
   {
       return element >= 50;
   }
   
   scores = [0, 15, 4, 78, 96, 65, 49];
   passed = array_filter(scores, passed_the_test);


배열 요소 값이 50보다 크거나 같으면 true를 반환하고 그렇지 않으면 false를 반환하는 콜백 메서드 _the_test를 정의합니다.

 

그런 다음 0에서 100 사이의 다양한 값으로 점수 배열을 만듭니다.

마지막으로 이 배열에서 array_filter를 콜백 메서드와 함께 호출하고 전달된 변수에 조건에 맞는 새 배열을 저장합니다.

전달된 배열은 콜백 메서드에 설정된 조건을 충족하는 50보다 크거나 같은 점수 배열의 값만 포함합니다.

 

 

 

 


   ● array_filter_ext(array, function, [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백 메서드. true 또는 false를 반환하는 조건자 메서드.


   - [offset] : [선택 사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                     음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택 사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 array_filter와 유사하지만 새 배열을 반환하지 않고, 원래 배열을 필터링하여 수정합니다.

배열의 모든 요소에 대해 실행되는 콜백 메서드는 조건에 따라 true 또는 false를 반환해야 합니다.

콜백 메서드가 true를 반환하는 첫 번째 요소는 오프셋으로 지정된 인덱스에 기록되고 나머지는

후속 인덱스(길이 매개변수의 부호로 지정된 방향)에 기록됩니다.

 

이 함수는 지정된 오프셋 위치에서 시작하여 길이 인수로 설정된 방향으로 유효한 요소들의 개수를 반환합니다.

반환값은 콜백 메서드가 true를 반환하고 배열에 다시 기록된 요소의 개수입니다.

 

  ※ [참조] 이 함수는 원본 배열을 직접 변경합니다.

  ※ 오프셋 및 길이 매개변수로 지정된 범위의 기존 배열 요소를 덮어쓸 수 있습니다.

 

   - 반환값 : 실수(배열의 유효한 요소 개수)

 


   var _is_even = function(_element, _index) {
     return (_element mod 2) == 0;
   }
   
   var _values = [1, 2, 3, 4, 5, 6, 7, 8, 9];
   var _valid_elements = array_filter_ext(_values, _is_even, -2, -infinity);


위의 코드는 먼저 요소 및 인덱스 매개변수를 사용하고 요소가 짝수일 때 true를 반환하는 _is_even 함수를 정의합니다.

배열 값은 1에서 9까지의 숫자로 구성합니다.

마지막으로 콜백 메서드와 함께 배열에서 array_filter_ext를 호출합니다.

배열에서 필터링할 범위의 시작 인덱스는 -2(마지막에서 두 번째 인덱스)이고 길이는 - infinity 로 역순으로 탐색합니다.

따라서 인덱스 8에서 검사를 시작하고 배열의 첫번째 인덱스까지 거꾸로 탐색합니다.

이에 함수는 4개의 짝수(8, 6, 4, 2)를 찾으므로, 유효한 요소 수 4를 반환합니다.

 

이 함수는 원래 배열을 변경하므로, 원래 배열인 _values는 검색을 시작한 인덱스부터 거꾸로 배열을

유효한 값들로 덮어씌워 [1, 2, 3, 4, 2, 4, 6, 8, 9]가 됩니다.

 

 

 

 


   ● array_copy_while(array, function, [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백 메서드. true 또는 false를 반환하는 조건자 메서드.


   - [offset] : [선택 사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택 사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 주어진 배열(또는 배열의 범위)의 필터링한 새 배열을 반환합니다.

함수는 새 배열을 만들고 콜백 메서드가 true를 반환하는 동안, 입력 배열의 요소를 추가합니다.

 

콜백 메서드가 false를 반환하는 즉시 콜백 메서드는 실행을 중지되고, 그 뒤에 오는 요소들은 확인 및 추가하지 않습니다.

 

※ [참고] 이 함수는 콜백 메서드가 처음으로 false를 반환한 후 실행을 중지한다는 차이점을 제외하면 array_filter와 동일합니다.

※ array_filter는 콜백 메서드가 false를 반환(해당 인덱스 값은 배열에 추가되지는 않음)하더라도 배열 끝까지 요소를 계속 확인합니다.

 

   - 반환값 : Array

 

예를 들어, 배열을 특정 인덱스에서 탐색하고, 특정 값("STOP")이 나오지 않을 때 까지만 배열을 추가한다고 합시다.


   array = ["1", "2", "3", "STOP", "4", "5", "6", "STOP", "7", "8", "9"];

   var _stop_filter = function(element, index)
   {
       return (element != "STOP");
   }

   array_up_to_stop = array_copy_while(array, _stop_filter, -1, -infinity);


위의 코드는 먼저 사이에 문자열 'STOP'이 있는 처음 9자리를 포함하는 문자열을 저장하는 배열 배열을 만듭니다.

그런 다음 문자열 'STOP'과 같지 않을 때 true를 반환하는 콜백함수를 _stop_filter 정의 합니다.

 

array_copy_while 함수를 콜백 메서드와 함께 호출하고, 오프셋 매개변수는 -1(마지막 인덱스)로, 길이는 -무한대로 설정합니다.

그러면 마지막 배열 인덱스에서 시작하여 값을 거꾸로 탐색 시작하겠죠.

 

마지막으로 결과는 array_up_to_stop 변수에 저장되며, 배열이 역순으로 순회되었으므로 "9", "8" 및 "7"만 포함해야 합니다.

 

 

 


   ● array_map(array, function, [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백 메서드


   - [offset] : [선택 사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택 사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 콜백 메서드를 기반으로 배열을 수정한 새 배열을 반환합니다.

 

콜백 메서드는 해당 인덱스에 적용되는 모든 값을 반환할 수 있습니다.

사용한 원래 배열은 변경되지 않습니다.

 

   - 반환값 : Array

 

예를 들어, 배열에 저장된 값을 2배로 늘려봅시다.


   var _numbers = [1, 2, 3, 4, 5];


   var _double = function (_element, _index)
   {
       return _element * 2;
   }


   var _numbers_doubled = array_map(_numbers, _double);


위의 코드는 1에서 5까지의 숫자로 배열 _numbers를 만듭니다.

배열 요소와 인덱스를 사용하고 2를 곱한 요소를 반환하는 콜백 메서드 _double을 만듭니다.

array_map 함수로 배열과 함께 콜백함수를 호출하면 [2, 4, 6, 8, 10]과 같이 모든 숫자가 두 배가 된 수정된 버전의 배열을 반환하게 됩니다.

물론 원래 배열은 변경되지 않습니다.

 

 

 

 

 


   ● array_map_ext(array, function, [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백 메서드


   - [offset] : [선택 사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                     음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택 사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다


이 함수는 array_map과 유사하지만 새 배열을 반환하지 않고, 원래 배열을 수정합니다.

 

배열과 함께 배열의 모든 요소에 대해 실행되는 콜백 메서드를 제공하여 배열을 수정합니다.

콜백 메서드는 배열 인덱스에 적용되는 모든 값을 반환할 수 있습니다.

 

이 함수는 콜백 메서드에 유효한 요소의 개수(주어진 범위에서 수정된 요소의 수)를 반환합니다.

 

   ※ [참고] 이 함수는 입력 배열을 직접 변경할 수 있습니다.

   ※ 오프셋 및 길이 매개변수로 지정된 범위의 기존 배열 요소를 덮어쓸 수 있습니다.

   ※ 그리고 배열이 아닌 수정된 요소의 개수가 대신 반환됩니다.

 

   - 반환값 : 실수(배열의 유효한 요소 수)

 

예를 들어, 배열에 저장한 값을 제곱한 값으로 변경해봅시다.


   var _values = [7, 4, 11, 9, 12, 21, 17, 1, 2, 3];
   elements = array_map_ext(_values, sqr, 2, 5);


위의 코드는 먼저 일련의 숫자로 배열 값을 만듭니다.

그런 다음 array_map_ext를 사용하여 내장된 sqr 함수(제곱)를 배열 범위에 적용합니다.

원래 배열 _values 값은 인덱스 2에서 6까지 원래 있던 값의 제곱으로 변경되고, 수정된 요소의 개수를 elements 변수에 저장합니다.

 

 

 

 


   ● array_unique(array, [offset], [length])

   - array : 사용할 배열


   - [offset] : [선택 사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                     음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택 사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 지정한 배열에서 중복 값이 제거된 새 배열을 반환합니다.

 

   - 반환값 : Array

 

예들 들어, 아래와 같이, 여러개의 문자열중 중복된 값을 제거한 새 배열을 만들어 봅시다.


   var _values = ["rock", "paper", "scissors", "rock", "rock", "scissors", "paper", "scissors"];
   var _values_unique = array_unique(_values);


위의 코드는 먼저 임시 배열 값을 만듭니다.

그런 다음 array_unique를 호출하고 중복 값을 제거한 결과를 임시 변수 values_unique에 저장합니다.

이 배열에서 중복 값을 제거하면 ["rock", "paper", "scissors"] 유효 값이 포함됩니다.

 

 

 

 


   ● array_unique_ext(array, [offset], [length])

   - array : 사용할 배열


   - [offset] : [선택 사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택 사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 array_unique와 유사하지만 함수에 전달한 원래 배열을 직접 수정합니다.

오프셋에서 시작하여 배열에서 찾은 고유한 값만 쓰고 중복된 값은 무시(중복된 값은 제거)하여 배열을 수정합니다.

 

함수는 배열에서 수정된 요소의 개수를 반환합니다.

 

   ※ [중요] 이 함수는 입력 배열을 직접 변경할 수 있습니다.

   ※ 오프셋 및 길이 매개변수로 지정된 범위의 기존 배열 요소를 덮어쓸 수 있습니다.

   ※ 그리고 배열이 아닌 수정된 요소의 개수가 대신 반환됩니다.

 

   - 반환값 : 실수(배열의 유효한 요소 수)

 

예들 들어, 아래와 같이, 여러개의 숫자중 중복된 값을 제거한 새 배열을 만들어 봅시다.


   values = [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8];
   valid_values = array_unique_ext(array);


위의 코드는 먼저 일련의 값으로 배열 값을 만듭니다.

그런 다음 array_unique_ext를 호출하고 중복 값을 제거한 결과로 원래 배열을 변경합니다.

그리고 함수로 수정된 요소의 개수를 valid_values 변수에 저장합니다.

 

 

 

 


   ● array_foreach(array, function, [offset], [length])

   - array : 사용할 배열
   - function : 각 요소에서 실행할 콜백 메서드


   - [offset] : [선택 사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택 사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 배열(또는 배열의 범위)을 반복하고 각 요소에 대한 콜백 메서드를 실행합니다.

배열을 직접 수정할 수 없지만, 배열내 요소 중 배열, 또는 구조체를 수정할 수 있습니다.

 

   - 반환값 : 없음

 

아래와 같이 배열 내에 구조체가 있을 때, 구조체 값을 변경해봅시다.


   var _array =
   [
       { x: 4, y: 5 },
       { x: 12, y: 8 },
       { x: 75, y: 23 }
   ];


먼저 각 구조체가 x 및 y 값을 저장하는 구조체 배열의 임시 배열을 만듭니다.


   var _set_x_to_index = function(_element, _index)
   {
       _element.x = _index;
   }


   array_foreach(_array, _set_x_to_index);


그런 다음 콜백 메서드로 배열의 요소와 배열 인덱스을 가져와, 요소의 x를 해당 인덱스로 설정하는 것으로 정의합니다.

array_foreach 함수로 배열과 함께 콜백 메서드를 호출합니다.

코드가 실행되면 배열 내 모든 구조체의 x 값은 배열 인덱스로 설정됩니다.

 

 

 

 


   ● array_contains(array, value, [offset], [length])

   - array : 값을 찾을 배열
   - value : 배열에서 찾을 값

   - [offset] : [선택사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                   음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 주어진 값이 배열에 존재하는지 확인합니다.

값이 있으면 true를 반환하고, 없으면 false를 반환합니다.

 

※ [참고] 배열이 단순히 값을 포함하는 것이 아니라 특정 조건을 만족하는 값을 포함하고 있는지 확인하려면 array_any를 사용하세요.

 

   - 반환값 : Boolean

 

예 1) : 배열


   var _digits_decimal = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
   var _contains = array_contains(_digits_decimal, 3);

   show_debug_message("배열에 3을 포함하고 있는가 : {0}", _contains);


위의 코드는 먼저 0에서 9까지의 수를 포함하는 배열 _digits_decimal을 정의합니다.

그런 다음 array_contains를 호출하여 값 3이 배열에 있는지 확인합니다.

마지막으로 결과와 함께 디버그 메시지를 표시합니다.

_digits_decimal 배열에 3이 포함되므로 true(1)가 반환됩니다.

 

예 2): 배열의 배열


   var _a = [0, 1, 2];
   var _b = _a;
   var _array_of_arrays =
   [
       [
           "this", "that", "another thing"
       ],
       _a
   ];

   show_debug_message(array_contains(_array_of_arrays, _a));
   show_debug_message(array_contains(_array_of_arrays, _b));
   show_debug_message(array_contains(_array_of_arrays, [0, 1, 2]));
   show_debug_message(array_contains(_array_of_arrays, ["this", "that", "another thing"]));


위의 코드는 먼저 세 가지 임시 변수를 정의합니다.

배열 _a, _a를 참조하는 변수 _b, 그리고 배열내 배열을 포함하고 있는 _array_of_arrays입니다.

 

그런 다음 4가지 상황에서 array_contains를 호출한 결과와 함께 4가지 디버그 메시지를 표시합니다.

첫번째는 배열 _array_of_arrays는 배열 _a를 요소로 추가했기 때문에, _a의 포함여부는 true를 반환합니다.

두번째는 _b는 배열 _a를 참조하기 때문에 _b의 포함 여부는 true를 반환합니다.

세번째는 동일한 값을 포함했지만, 매칭되는 동일한 배열이 아니기 때문에 false를 반환합니다.

매칭하려는 값은 1차 배열이고, _array_of_arrays는 _a가 아래와 같이 배열 내에 2차 배열로 값을 포함하기 때문이죠.


   var _array_of_arrays =
   [
       [
           "this", "that", "another thing"
       ],
        [0, 1, 2]
   ];


네번째도 마찬가지로 매칭되는 동일한 배열이 아니기 때문에 false를 반환합니다.

 

 

 

 

 


   ● array_contains_ext(array, values, matchAll, [offset], [length])

   - array : [배열] 값을 매칭할 배열

   - values : [배열] 매칭 값을 포함하는 배열입니다.
                  값은 나열된 순서대로 배열에서 매칭될 필요가 없으므로 순서는 고려하지 않아도 됩니다.

   - matchAll : [Boolean] 모든 값이 배열에 있어야 하는지(true),
                      또는, 값 중 하나만 있어도 되는지(false) 여부입니다.



   - [offset] : [선택사항] 검사할 배열의 오프셋 또는 시작 인덱스입니다.
                    음수 값을 설정하면 배열의 끝에서부터 계산됩니다.

   - [length] : [선택사항] 검사할 요소의 수입니다. 음수 값은 배열을 거꾸로 탐색합니다.


이 함수는 주어진 배열(또는 그 일부)에 매칭할 값의 일부, 또는, 전부가 포함되어 있는지 확인합니다.

 

matchAll 인수는 모든 값이 배열에 있어야 하는지(true) 또는 값 중 하나라도 포함되는지(false)를 결정합니다.

 

values 인수는 배열로 중복 항목을 포함할 수 있습니다.

 

matchAll이 비활성화(false)일 때는 지정한 배열에서 매칭 배열의 값이 하나라도 발견되면 true를 반환하고,

발견되지 않으면 false를 반환합니다.

 

matchAll이 활성화되면 원래 배열에 존재하는 값 매칭 여부(값과 중복 개수 일치여부)를 정확히 확인할 수 있습니다.

matchAll이 활성화(true)되었을 때는 지정한 배열에서 매칭 배열의 중복 항목 개수와 값이 동일하게 발견되면

true를 반환하고, 그렇지 않으면 false를 반환합니다.

여기에서 매칭 여부는 배열 순서와는 상관 없습니다.

 

※ [참고] 배열이 단순히 값을 포함하는 것이 아니라 특정 조건을 만족하는 값을 포함하고 있는지 확인하려면 array_any를 사용하세요.

 

   - 반환값 : Boolean

 

예 1): 주어진 값이 배열에 있는지 확인


   hand = ["1", "1", "4", "J", "J", "Q", "7", "10", "K", "8", "7", "8", "5"];
   var _high_cards = ["A", "K", "Q", "J"];
   var _any_high_cards = array_contains_ext(hand, _high_cards, false);
  

   show_debug_message(_any_high_cards);


위의 코드는 먼저 13개의 값을 가진 카드 배열을 만듭니다.

그런 다음 "높은" 카드로 다른 배열 _high_cards 를 정의합니다.

다음으로 array_contains_ext를 사용하여 hand 배열에 _high_cards 배열 포함여부 결과를 임시 변수 _any_high_cards에 저장합니다.

마지막으로 디버그 메시지는 변수 _any_high_cards의 값을 보여줍니다.

_high_card 배열이 포함하는 값이 hand 배열의 값과 1개 이상 일치하기 때문에 _any_high_cards는 true(1)값이 반환됩니다.

 

예 2): 배열에 모든 값이 있는지 확인


   inventory = ["포션", "엘릭서", "포션", "허브", "허브", "특별한 향신료"];
   var _required_items = ["허브", "허브"];
   var _can_make_potion = array_contains_ext(inventory, _required_items, true);
  

   show_debug_message("인벤토리의 현재 콘텐츠를 사용하여 물약을 만들 수 {0}."
   , _can_make_potion ? "있습니다" : "없습니다");



 

위의 코드는 먼저 항목의 기본 인벤토리를 저장하는 배열을 만듭니다. 항목은 문자열로 저장됩니다.

그런 다음 "포션"을 만드는데 필요한 항목을 포함하는 임시 배열 _required_items를 정의합니다.

 

다음 array_contains_ext는 _required_items의 모든 값이 인벤토리에 있는지 확인하기 위해 호출됩니다.

이는 matchAll 인수를 true로 설정하여 수행하고, 결과는 변수 _can_make_potion에 저장됩니다.

마지막으로 인벤토리의 현재 콘텐츠에서 "물약"을 만들 수 있는지 여부를 알려주는 디버그 메시지가 표시됩니다.

_required_items 배열의 2개의 "허브" 중복 항목이 inventory 배열에서도 2개로 동일하게 발견되었기 때문에

_can_make_potion는 true(1)를 저장할 겁니다.

 

 

 

 

 

 

 

 

300x250