Rev. 2.73

$A함수는 Array.from로서도 사용할 수 있습니다.인수 iterable 가null라면 요소 없음의 배열을 반환합니다.iterable에 toArray 메서드가 있으면 그 결과를 반환합니다.그 이외의 경우, iterable의 인덱스 0~length-1의 요소의 값을 배열에 격납해 반환합니다.

이 때문에, 변환하는 오브젝트는 toArray 메서드인가, length 프롭퍼티를 가지고 있을 필요가 있습니다.단순한 커스텀 오브젝트를 배열로 변환하는 기능은 없습니다.배열에 가까운 구조의 오브젝트로 Array 클래스의 메서드를 사용하고 싶은 경우에 이용할 수 있습니다.

<p>영</p>
<p>일</p>
<p>이</p>
<p>참</p>

<script language="javascript">
<!--
function init(){
  var pElm = document.getElementsByTagName('p');
  var ary = $A(pElm);
  ary.each(function(value){alert(value.innerHTML);});
  //each 메서드를 사용할 수 있다.
  //"영", "일", "이", "참"가 순서에 표시된다.
}
init();
//-->
</script>

기존 Array 클래스에 대해서 메서드를 추가하고 있습니다.우선 Enumerable 클래스를 Array 클래스에 계승시킵니다.다음에_reverse 메서드에 기존 reverse 메서드를 카피하고 있는 그 후, 다른 메서드를 추가하고 있습니다.

_each 메서드
each 메서드는, 계승한 Enumerable 클래스에서 추상 메서드 취급이 되어 있는 것입니다.Enumerable 클래스를 계승했을 경우는 반드시 정의하지 않으면 안됩니다.Array 클래스에서는 인덱스 0~length-1의 요소를 순서에 인수로 건네받은 함수iterator로 처리하고 있습니다.이렇게 하는 것으로, Enumerable 클래스로부터 계승한 메서드는 배열의 각 요소를 순서에 처리할 수가 있습니다.

_each 메서드는 외부로부터 사용되는 것을 상정하고 있지 않습니다.

clear 메서드
clear 메서드는 배열(this)의 length를 0으로 해, 배열(this)을 반환합니다.length를 0으로 하는 것만으로 좋네요···.

first 메서드
최초의 요소의 값을 반환합니다.

last 메서드
마지막 요소의 값을 반환합니다.length-1은 항상 최대 인덱스가 됩니다.

compact 메서드
Enumerable 클래스로부터 계승한 select 메서드에 의해, 값이 undefined가 아니고, 또는 null가 아니다···라는 어? 여기는 「한편」(&&)에 해야 할과 같은.다만, undefined와 null는 거의 동일 취급이므로, 동작에 문제는 없는 것 같습니다만··· 어쨌든, undefined가 아니고 한편 null가 아닌 요소만의 배열로 해 반환하는 메서드입니다.

flatten 메서드
2 차원 이상의 배열을 1 차원으로 변환하는 메서드입니다.inject 메서드에 제2 인수로 건네주고 있는 함수에서는, 요소의 값이 배열인지 어떤지를, Object 클래스의 기존 constructor 프롭퍼티에 의해 판정하고 있습니다.배열이면 재귀적으로 flatten 메서드를 호출합니다.이렇게 해 array에 기존 concat 메서드로 차례차례로 연결해 갈 것입니다.[value]는, concat하기 위한 단요소 배열을 작성하는 것입니다.

var ary = [0, [11, 12], [[211, 212], [221, 223]]].flatten();
alert(ary);
//ary는 배열."0, 11,12,211,212,221,223"라고 표시된다

without 메서드
우선, 인수 모든 것을 배열 values로 변환합니다.자배열 this의 select 메서드와 values의 include 메서드에 의해, values에 존재하지 않는 자배열 this의 요소의 값만의 배열을 반환하고 있습니다.

indexOf 메서드
자배열 this에 인수로 지정된 오브젝트가 존재하는 경우에 그 인덱스를 반환합니다.없으면―1을 반환합니다.

var obj0 = new Object();
var obj1 = new Object();
var obj2 = new Object();
var obj3 = obj2;
var obj4 = new Object();
var ary = [obj0, obj1, obj2];
alert(ary.indexOf(obj2)); //"2"라고 표시된다
alert(ary.indexOf(obj3)); //"2"라고 표시된다
alert(ary.indexOf(obj4)); //"-1"라고 표시된다

reverse 메서드
기존 reverse 메서드를 오버라이드(override) 하고 있습니다.인수 inline가 false가 아닌 경우(null, undefiend 포함한다), 자배열 this를_reverse 메서드(기존 메서드를 보관 유지)에 의해 역순에 줄서 바꿉니다.false의 경우, toArray 메서드에 의해 별배열을 작성, 이것을 역순에 줄서 바꾸어 반환합니다.

기존 메서드는 원래의 배열도 줄서 바꾸어 버리므로, 오버라이드(override) 해 그 회피 수단을 주고 있는 것입니다.

!==(은)는 「오브젝트도 동일한지 어떤지를 판정.동일하지 않으면 true」라고 하는 의미입니다만, 여기에서는 어떤 경우에 유효한가를 모릅니다···.

var org = [0,1,2,3];
var ary = org.reverse(false);
alert(ary); //"3, 2,1,0"라고 표시된다
alert(org); //"0, 1,2,3"라고 표시된다
ary = org.reverse();
alert(ary); //"3, 2,1,0"라고 표시된다
alert(org); //"3, 2,1,0"라고 표시된다

shift 메서드
우선 자배열 this의 최초의 요소의 값을 result 로 유지합니다.다음의 요소 이후의 값을 인덱스를―1씩 늦추어 격납합니다.그 후 length를―1해, result를 반환합니다.

shift 메서드는 기존으로, 여기에서는 오버라이드(override) 하고 있게 됩니다. 기존에서는, 요소가 없는 경우와 요소의 값이 undefined의 경우로 같은 동작(undefined를 반환)이 됩니다. 버젼 1.5.0_rc0에서는 메서드 자체가 없어져 있습니다.지나치게 생각하고였다 같습니다...

var ary = [0,1,2,3];
try{
  alert(ary.shift()); //"0"가 표시된다
  alert(ary.shift()); //"1"가 표시된다
  alert(ary.shift()); //"2"가 표시된다
  alert(ary.shift()); //"3"가 표시된다
  alert(ary.shift()); //에러가 된다(기존이라면 undefined)
}catch(e){
  alert(e);
}

inspect 메서드
map 메서드에 의해 자배열 this의 각 요소를 전술 Object.inspect에 의해 캐릭터 라인화해, join 메서드에 의해 「,」그리고 연결하고 있습니다.Object.inspect 메서드에 의해 불려 가는 것이 전제입니다.

Comments

Got something to add? You can just leave a comment.

Your Reaction Time!

captcha

avatar