2012-02-21 38 views
0

我不是Javascript的專家,我在嘗試將我在這裏和其他地方找到的有關多維數組和排序的各種金塊粘合在一起時遇到問題,並想知道是否有人可以幫助我完成一個完整的示例?Javascript排序多維數組 - 一個完整的例子?

我已經設法達到了我可以使用通過Ajax讀取數據填充localStorage的程度。

行的格式...

(msgXXX)(密鑰1:值1 |鍵2:值2 |鍵3:值3 | ...等)

其中

(msgXXX)是localStorage密鑰;和

(密鑰1:值1 |鍵2:值2 |鍵3:值3 | ...等)是單一串聯localStorage的數據串

我希望能夠做的是轉換這一切的多維數組,我可以應用各種排序。例如,其中一個Keys被稱爲「Timestamp」,並且該值是一個表示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 | ...等 因此,增加對整個格式的支持,這裏的修改:

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; 
} 

如果你申請這個給你了,你會得到這樣的例子:

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

希望這將清除事爲你。

+0

非常好。這似乎做我需要的一切 - 除了我不知道正確的語法訪問排序的數組。 arr是否被排序後的輸出替換,還是需要將第二個數組設置爲這個? arr中的第一個鍵似乎是行號,但我如何訪問其他鍵?謝謝。皮特。 – 2012-02-22 12:46:46

+0

我編輯了我的答案並回答了 – 2012-02-22 13:33:14

+0

(和其他人)。這工作:'var obj = arr [i]; for(var j in obj){out + = j +「:」+ obj [j] +「\ n
」; }',但明確指定鍵爲'obj [Key1]'不。你能幫我理解爲什麼嗎? – 2012-02-28 17:46:47