actionscript-3 - as3 - 액션스크립트 배열




AS3 Flex에서 정렬 된 객체/맵? (2)

Actionscript 3 Flex에서 객체를 정렬하거나 객체에 어떤 종류의 순서를 지정할 수 있습니까? 나는 이렇게 창조 된 대상을 가지고있다 :

private var data:Object = new Object();

그런 다음 몇 가지 키와 값을 입력하십시오.

this.data.someKeyOne = 0;
this.data.someKeyTwo = 1337;
this.data.someKeyThree = 123;

그 후 객체를 반복합니다.

for (var dataPart:String in this.data) {
    trace("Key: " + dataPart = " Value:" + this.data["dataPart"]);
}

하지만 내 문제는 내가 초기화 한 순서대로 데이터가 표시되지 않는다는 것입니다. 이것은 초기화 된 순서대로 있어야하기 때문에 실망 스럽습니다.


@helloflash는 객체를 통한 루프에 대한 답변 에서 말했고 Adobe의 associative array 정의 (Object 클래스의 인스턴스)에 따라 다음과 같이 말합니다.

연관 배열 (해시 또는 맵이라고도 함)은 숫자 인덱스 대신 키를 사용하여 저장된 값을 구성합니다. 연관 배열의 각 키는 저장된 값에 액세스하는 데 사용되는 고유 한 문자열입니다. 연관 배열은 Object 클래스의 인스턴스이며 각 키는 속성 이름에 해당합니다. 연관 배열은 정렬되지 않은 키와 값 쌍의 콜렉션입니다. 귀하의 코드는 연관 배열의 키가 특정 순서로 있어야한다고 기대해서는 안됩니다.

가지고있는 비헤이비어는 정상이며 케이스에 정렬 된 키를 가져올 수 없습니다 (이와 같은 Object 사용).

키가 필요 없다면 간단한 배열이나 벡터를 사용하여 @helloflash가 답변 한대로 할 수 있습니다. 그렇지 않으면 다음과 같이 객체 배열을 사용할 수 있습니다.

var obj:Object, i:int, s:String;

var data_array:Array = [
        {key: 'someKeyOne', value: 0},
        {key: 'someKeyTwo', value: 1337},
        {key: 'someKeyThree', value: 123}
    ]
for(i = 0; i < data_array.length; i++){
    obj = data_array[i];
    trace('Key : ' + obj.key + ', Value = ' + obj.value);
}
for (s in data_array) {
    obj = data_array[s];
    trace('Key : ' + obj.key + ', Value = ' + obj.value);
}
for each (obj in data_array){
    trace('Key : ' + obj.key + ', Value = ' + obj.value);
}

// all these 3 loops give :     
//  Key : someKeyOne, Value = 0
//  Key : someKeyTwo, Value = 1337
//  Key : someKeyThree, Value = 123

또는 Object를 사용하여 다음과 같이 Array에 정렬 할 수 있습니다.

var data_object:Object = new Object();
    data_object.someKeyOne   = {index:0, value: 0};
    data_object.someKeyTwo   = {index:1, value: 1337};
    data_object.someKeyThree = {index:2, value: 123};

var tmp_array:Array = sort_obj(data_object);

for(i = 0; i < tmp_array.length; i++){
    obj = tmp_array[i];
    trace('Key : ' + obj.key + ', Value = ' + obj.value);
}
for (obj in tmp_array) {
    obj = tmp_array[obj];
    trace('Key : ' + obj.key + ', Value = ' + obj.value);
}
for each (obj in tmp_array){
    trace('Key : ' + obj.key + ', Value = ' + obj.value);
}

function sort_obj(obj:Object):Array {
    var a:Array = [];
    for (var key:String in obj) {
        a.push({key: key, index: obj[key].index, value: obj[key].value});
    }
    a.sortOn('index', Array.NUMERIC);
    return a;
}

// all these 3 loops give :     
//  Key : someKeyOne, Value = 0
//  Key : someKeyTwo, Value = 1337
//  Key : someKeyThree, Value = 123

당신을 도울 수있는 모든 것들이 있기를 소망하십시오.


루핑 에 대한 Adobe의 도움 :

for..in 루프는 객체의 속성 또는 배열 요소를 반복합니다. 예를 들어 for..in 루프를 사용하여 일반 객체의 속성을 반복 할 수 있습니다 (객체 속성은 특정 순서로 유지되지 않으므로 속성이 임의의 순서로 표시 될 수 있음)

결론

키를 순서대로 표시하려면 Array (또는 Vector )을 사용해야합니다.

var myArray:Array = [0, 1337, 123];

for (var i:String in myArray) {
    trace(myArray[i]);
}
// output: 0, 1337, 123