2011-08-30 4 views
1

목적맞춤 자바 스크립트 객체 정렬 및 유지 인덱스 연관

var obj = { 
    uniquestring1: 
    { 
     obj1: 'content', 
     obj2: 'content' 
    }, 
    uniquestring2: 
    { 
     obj1: 'content' 
    } 
} 

그래서 처음 부모 요소가 포함되는 요소의 수만큼 개체를 정렬 할 필요가있다. .sort 함수의 사용은 저에게 해답을주지 못합니다. 배열의 배열을 유지하지 않으면 안되기 때문입니다.

var obj = { 
    uniquestring2: 
    { 
     obj1: 'content' 
    }, 
    uniquestring1: 
    { 
     obj1: 'content', 
     obj2: 'content' 
    } 
} 
+1

정렬 된 배열이 아니기 때문에 개체의 속성을 정렬 할 수 없습니다. 아마도 특정 순서로 속성을 반복하고 싶습니까? – js1568

+0

일부 정렬 알고리즘을 구현합니다. jquery .sort가 사용자의 케이스에 맞지 않으면 사용하지 마십시오. http://stackoverflow.com/questions/220044/which-sort-algorithm-works-best-onmost-sorted-data –

답변

4

에 javscript 객체와 작동 것입니다. 정렬하려면 어딘가에 배열이 있어야하며 코드에 배열이 표시되지 않습니다.

개체 키에는 정의 된 순서가 없습니다.

  • 주문한 액세스 만 필요하면 배열을 사용하십시오.
  • 키순 액세스 만 필요한 경우 개체를 사용하십시오.
  • 두 가지 방법으로 액세스해야하는 경우 병렬 배열을 사용할 수 있지만 데이터가 변경되지 않는 한 고통입니다. , 정렬 된 순서로 키를 통과 할, 그리고

    var obj = { 
        uniquestring1: 
        { 
         obj1: 'content', 
         obj2: 'content' 
        }, 
        uniquestring2: 
        { 
         obj1: 'content' 
        } 
    } 
    
    var objOrder = []; // sorted arrays that contains first level keys into obj 
    var num; 
    for (var i in obj) { 
        objOrder.push(i); // get all keys into the array 
        num = 0; 
        for (var j in obj[i]) { 
         ++num;   // count items in each key object 
        } 
        obj[i].keyCnt = num; // save this for later sorting purposes 
    } 
    // now sort the parallel array by keyCnt 
    objOrder.sort(function(a, b) { 
        return(obj[a].keyCnt - obj[b].keyCnt); 
    }); 
    

    당신처럼 할 것 :

이 같은 정렬 된 순서로 키 참조를 포함 병렬 배열 한 번 생성을 할 수 이 :

for (var i = 0; i < sortedOrder.length; i++) { 
    var item = obj[sortedOrder[i]]; 
    // do something with item here 
} 
2

obj 해시하지 배열, 그래서 당신은 그것을 정렬 할 수 없습니다 :

결과가 있어야한다. 예 : obj[0]; // is undefined. 지금 당신이 가지고있는 경우 :

var obj = { 
    uniquestring1: 
    { 
     obj1: 'content', 
     obj2: 'content' 
    }, 
    uniquestring2: 
    { 
     obj1: 'content' 
    } 
}; 
var arr = [], 

for(var i in obj) { 
    arr.push(obj[i]); 
} 

arr.sort(function (a, b) { 
    return Object.keys(a).length - Object.keys(b).length; 
}) 

그런 다음 그와 같은 그들이 정렬 할 수 있도록 정렬 순서가없는 Object.keys

+0

물론, 내가 그 이유를 물었습니다. – keepwalking

+1

@keepwalking : 왜 해결 방법을 찾고 있습니까? 이게 뭐가 잘못 됐어? 라벨이 필요한 경우 오브젝트를 다른 * 오브젝트에 포장해야합니다. {label : 'uniquestring1', 값 : { obj1 : 'content', obj2 : 'content' } –

+0

키 워킹 편집 – Joe