2012-02-17 9 views
2

ソートする前に、キーで配列の値に正しくアクセスできます。ソート後配列を並べ替えるとエントリが削除されますか?

var a=[]; 
a['1']={'id':'1','aaa':'xxx'} 
a['2']={'id':'2','bbb':'yyy'} 

document.write(a['1'].id+' '+a['2'].id+'<br>') 

、キーがインデックスに変わる:

a.sort(function(a, b) { 
    var x = a.id; 
    var y = b.id; 
    return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
}); 

alert('a["1"]='+a['1'].id+'\n\na["2"]='+a['2']) 

[ "2"]は未定義となります。問題はどこだ?並べ替えが間違っていますか?ここで

は一例です: http://jsfiddle.net/TJLtS/1/

+1

注:JavaScriptでは、 'a [" 1 "]'は 'a [1]'と同じです。引用符を使用する理由はありません。 – Phrogz

答えて

3

あなたの問題は、JavaScriptでの配列は0ベース、1ベースではないということです。ソート後、最初の要素はa[0]で、2番目の要素はa[1]です。ソート後にはa[2]はありません。

ブラウザで開発者ツールを開くと、これが表示されます。—最新のブラウザーにはすべてのブラウザがあります。あなたがそれを見つけるのを助ける必要があるならGoogleはソートの後に—とコードconsole.log(a)を追加する。 alertを使用すると、コードをデバッグするのに最も苦労し、効率の悪い可能性があります。 http://jsfiddle.net/TJLtS/2/

また、今後の参考のために、あなたは、より簡単に、あなたのオブジェクトリテラルを宣言することを望むかもしれない:

はここで働いて、あなたのスクリプトの更新版です

var a = [ 
    {id:'1', aaa:'xxx'},  // This is a[0] 
    {id:'2', bbb:'yyy'}  // This is a[1] 
]; 

あなたが見ることができるように、正当な識別子であるキーは、オブジェクトリテラルで引用符で囲む必要はありません。


編集ここでは、ニーズに応じて、あなたが興味を持つであろう2つの選択肢が、以下のとおりです。

は、すべてのオブジェクトを保持

var objects = [ 
    {id:"a1", name:"Jim"}, 
    {id:"a2", name:"Zed"}, 
    {id:"a3", name:"Bob"}, 
]; 
objects.sort(function(o1,o2){ 
    var n1 = o1.name, n2 = o2.name; 
    return n1<n2 ? -1 : n1>n2 ? 1 : 0; 
}); 
for (var i=0,len=objects.length; i<len; ++i){ 
    console.log(objects[i].id); 
} 
// Result: 
// a3, a1, a2 

ソートされた配列内のすべてのオブジェクトを保管してくださいハッシュで、別途注文

var objects = { 
    a1: {id:"a1", name:"Jim"}, 
    a2: {id:"a2", name:"Zed"}, 
    a3: {id:"a3", name:"Bob"}, 
}; 

// Easily look up an object by id (can't do this as easily or fast with array) 
var id = "a2"; 
console.log(objects[id]); // {id:"a2", name:"Zed"} 

// Create an array just the ids 
var ids = Object.keys(objects); 

// Sort the array of ids based on properties of the objects the represent 
ids.sort(function(id1,id2){ 
    var n1 = objects[id1].name, n2=objects[id2].name; 
    return n1<n2 ? -1 : n1>n2 ? 1 : 0; 
}); 

// Iterate the sorted array and use each key to find the object 
for (var i=0,len=ids.length; i<len; ++i){ 
    console.log(objects[ids[i]].name); 
} 
// Result: 
// Bob, Jim, Zed 
+0

ありがとうございますが、['1']が最初の要素である多次元配列が必要です。最初の配列として['589']にすることができます。 – Vad

+2

@Vadそれは意味をなさない。 a)私が既にコメントしたように、 'a [" 1 "]'と 'a [1]'はJavaScriptでは全く同じです。 b)配列をソートすると、最初のオブジェクトは(たとえそのオブジェクトが 'id:589'のようなプロパティを持っていても)常にインデックス '0'になります。 – Phrogz

+0

OK私はそれを持っていますが、私はいわゆるJavaScriptのハッシュマップが必要です。それを達成する方法?キーとして数字を使うことはできませんか? – Vad

1

Javaスクリプト配列は0で始まります。0番目の要素は最後にソートされます。

サンプルには「多次元配列」はありません。オブジェクトの配列だけです。

+0

['1']がキーである多次元配列が必要です - 引用符を使用する理由です。それはインデックスのように見えますが、['1A'] – Vad

+0

@ Vadのようなものです。最初の次元は配列内のオブジェクトの順序です。オブジェクト自体にはプロパティ間の順序付けが含まれていないため、多次元配列(配列の配列と呼ばれることもある)ではなく、オブジェクトの単純な配列を持ちます。 – Phrogz

+0

@Vad - 「配列」は実際に配列ではないので、http://stackoverflow.com/questions/1520714/javascript-sorting-collection-which-is-not-an-arrayをご覧ください。 –

関連する問題