2011-01-21 15 views
9

私はこのようなオブジェクトのJavaScriptの配列を有する:オブジェクトの配列内のオブジェクトのインデックスを取得する方法は?

box[0] = {...} 
box[1] = {...} 
box[2] = {...} 
... 
box[499] = {...} 

このオブジェクトは、同じコンストラクタによって生成され、ループ内の配列に追加されています。オブジェクトにはプロトタイプのメソッドがあり、配列内のオブジェクトのインデックスを知っている必要があります。現在私がやっていることは、ループ内に配列インデックスを作成するときに、各オブジェクトの内部にidというプロパティを設定することです。このような何か:私はsort()を使用して、配列の順序を変更するたびに、私は新しいインデックス値とidプロパティを更新するためのループを実行する必要があるため

box[i].id = i; 

私はこれで完全に満足していないが。

オブジェクトの内部配列内のそのインデックスを知るための方法があるかどうか私の質問は、idプロパティを設定しなくても、あなたは私を助けることができると思います。

ありがとうございます。

+1

私は、オブジェクトのメソッドは、そのオブジェクトのインデックスを知る必要がある場合、彼らはオブジェクトに属していないと思います。それらは、シングルトンインスタンスまたは配列のいずれかに属します。 – staticsan

+0

パトリックの丁度良い答えを見てください。このタイプの結合は、常に失敗につながります。指摘されたケースは、問題の「先端」に過ぎません。おそらく、異なる(しかし関連する)質問に対する実行可能な解決策があるでしょう。 –

答えて

19

Array内のオブジェクト内の関数が、それを参照しているArrayのインデックスを認識しようとしているとは思われません。

Array内の各項目は単にそのオブジェクトをメモリ内にポイントしているだけなので、同じオブジェクトを参照する数十のArray項目、変数、Objectプロパティなどが考えられるため、関数(または関数)は、あなたが望む後方参照を知らないでしょう。

Array内のインデックスを知る必要がある場合は、自分がやっていることをやり遂げようとしていると思います。

indexを返すので、関数はindexOf()を呼び出すことができますが、それは呼び出しごとに若干のオーバーヘッドが必要となるため、サポートされていないブラウザに追加する必要があります。

theArr.indexOf(this); // assuming the function was called from the context 
         // of the object in question 
2

各オブジェクトに一意のプロパティを追加し、そのプロパティを使用してそのオブジェクトのindexOfをルックアップするのはなぜですか。あなたは_idを追加してから使用してそのIDを検索することができ、コンストラクタがある場合は

function getIndex(box, objectId) { 
    var index = box.map(function(e) { return e._id; }).indexOf(objectId); 
    return index; 
} 

をこれは、配列をソートしても動作しますが、あなたは一意のIDを維持する必要があります。

Array.prototype.mapは、IE7またはIE8では使用できません。 ES5 Compatibility

ところで、私はこのソリューションを好きではないが、それはあなたの問題上で動作します:)

関連する問題