2012-02-21 9 views
0

私はJavascriptのエキスパートではありません。多次元の配列やソートについては、ここや他の場所で見つけたさまざまなナゲットを糊付けしてみるのに問題があります。誰かが完全な例を教えてくれるかどうか疑問に思っていますか?Javascript sort多次元配列 - 完全な例ですか?

私は、Ajaxを介して読み込まれたデータをlocalStorageに読み込むことができるようになってきました。

行の形式がある...

(msgXXX)(キー1:値1 |キー2:値2 |キー3:VALUE3 | ...など)

どこ

(msgXXX)はlocalStorageキーです。そして

(キー1:値1 |キー2:値2 |キー3:VALUE3 | ...など)私が行うことができるようにしたいどのような単一の連結のlocalStorageデータ列である

がにこのすべてを変換しています私はさまざまな種類を適用することができます多次元配列。たとえば、キーの1つは「タイムスタンプ」と呼ばれ、値はUnixエポックから秒を表す整数です。私はこのタイムスタンプ値に基づいてすべての行を降順でソートしたいと思います。現在、データセットはわずか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

EDIT

ソート方法は、配列自体を変更し、配列を返すので、何かやって両方:

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はソートされた出力に置き換えられるのですか、またはこの配列に2番目の配列を設定する必要がありますか? arrの最初のキーは行番号のように見えますが、他のキーにはどうやってアクセスしますか?ありがとう。ピート。 –

+0

回答を編集しました –

+0

(など)。これはうまくいきます: 'var obj = arr [i]; for(var j in obj){out + = j + ":" + obj [j] + "\ n
"; 'obj [Key1]'と明示的に指定することはできません。理由を理解するのを助けることができますか? –