2012-02-21 4 views
0

나는 자바 전문가가 아니기 때문에 다차원 배열 및 정렬과 관련하여 여기에서 찾을 수있는 여러 가지 덩어리를 서로 붙이려는 데 문제가 있습니다. 누군가가 완전한 예제를 통해 나를 도울 수 있는지 궁금하십니까?Javascript 정렬 다차원 배열 - 완전한 예?

저는 Ajax를 통해 읽은 데이터로 localStorage를 채울 수 있다는 점에 도달했습니다.

행의 형식은 ...

(msgXXX) (키 1 : 값 1 | 키 2 : 값 2 | 키 3 : VALUE3 | ... 등)

(msgXXX)은 localStorage 키입니다. 및

(키 1 : 값 1 | 키 2 : 값 2 | 키 3 : VALUE3 | ... 등) 내가 할 수 있기를 원하는 것은 하나의 연결된 로컬 스토리지의 데이터 문자열

이는 모든이를 변환입니다 내가 여러 종류를 적용 할 수있는 다차원 배열. 예를 들어, 키 중 하나를 "타임 스탬프"라고하고 값은 Unix 시대 이후의 초를 나타내는 정수입니다. 이 Timestamp 값을 기반으로 모든 행을 내림차순으로 정렬하고 싶습니다. 즉, 가장 최근의 것부터 시작합니다. 현재 데이터 세트는 600 개가 넘습니다.

저는 localStorage에서 데이터를 가져 오기 위해 추출과 분할 및 다이 싱을 할 수 있다고 생각합니다.하지만 배열을 채우고 설정하는 것과 관련하여 무엇을 목표로하고 있는지 확신 할 수 없습니다. 종류.

누군가 나를 올바른 방향으로 안내 할 수 있습니까?

답변

1

이 같은 갈 수

function create(line) { 
    var tokens = line.split("|"); 
    var obj = {}; 
    for (var i = 0; i < tokens.length; i++) { 
     tokens[i] = tokens[i].split(":"); 
     obj[tokens[i][0]] = tokens[i][1]; 
    } 

    return obj; 
} 

var arr = []; 
for (....) { // iterate over the input that each line is of key/value format 
    arr.push(create(line)); 
} 

function timestampSort(a, b) { 
    if (a == b) 
     return 0; 

    return a.timestamp < b.timestamp ? -1 : 1; 
} 

// to sort by timestamp 
arr.sort(timestampSort); 

이 코드는 당신이 준 형식으로, 키/값 라인 당 개체를 만듭니다. 객체는 키를 속성으로 갖습니다. 이러한 모든 객체는 배열로 푸시되고, 배열의 원시 정렬 메소드에 비교 함수를 전달하여 정렬됩니다. 물론 원하는만큼 많은 비교 함수를 만들 수 있습니다. 각 비교 함수는 서로 다른 속성/기준으로 비교됩니다.

현재 정렬 방법에 대한 자세한 읽을 수 있습니다 : http://www.w3schools.com/jsref/jsref_sort.asp

편집을

종류 방법을 모두 배열 자체를 변경하고 그래서 같은 일을, 배열을 반환

console.log(arr.sort(timestampSort)); 

실제 어레이를 변경하여 리턴하므로, console.log가이를 출력합니다. 원래의 배열을 변경하고 당신이 할 수있는 분류 얻을 것이다 그것의 사본을 갖고 싶어하지 않는 경우 :

var arr2 = arr.slice(); 
arr2.sort(timestampSort); 

배열의 키에 관해서는, 제가 의도 쓴 것은이에서만 작동하기를 일부 줄 : Key1 : Value1 | Key2 : Value2 | Key3 : Value3 | ...등 그래서, 전체 포맷에 대한 지원을 추가하기 위해, 여기에 수정이다 :

arr is: [{ 
    msgID: XXX, 
    Key1: Value1, 
    Key2: Value2, 
    Key3: Value3 
}] 

희망이 일을 지 웁니다 : 당신은 당신이 얻을 것이다 준 예에 이것을 적용하면

function create(line) { 
    var parts = line.match(/^\(msg(\d+)\) \((.+)\)$/); 
    var tokens = parts[2].split("|"); 
    var obj = { msgID: parts[1] }; 
    for (var i = 0; i < tokens.length; i++) { 
     tokens[i] = tokens[i].split(":"); 
     obj[tokens[i][0]] = tokens[i][1]; 
    } 
    return obj; 
} 

은 너를 위해서.

+0

우수. 이것은 내가 필요한 모든 일을하는 것처럼 보입니다 - 나는 정렬 된 배열에 접근하는 올바른 구문을 모르는 것을 제외하고는. arr이 정렬 된 출력으로 대체되거나이 배열에 두 번째 배열을 설정해야합니까? arr의 첫 번째 키가 줄 번호로 표시되지만 다른 키는 어떻게 액세스합니까? 감사. 피트. –

+0

답변을 –

+0

(및 기타 답변)으로 편집했습니다. 이것은 작동합니다 :'var obj = arr [i]; for (var j in obj) {out + = j + ":"+ obj [j] + "\ n
"; }'하지만 명시 적으로 키를'obj [Key1]'로 지정하는 것은 아닙니다. 왜 그 이유를 이해하도록 도와 주실 수 있습니까? –