2011-01-21 121 views
9

我有對象的JavaScript陣列是這樣的:如何獲取對象數組內的對象的索引?

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

此目的是通過相同的構造產生的,並加入到一個循環內的陣列。這些對象在原型中有方法,它們需要知道數組中的對象索引來完成它們的工作。目前我正在做的是在每個對象中設置一個名爲id的屬性,當我在循環中創建它時,它等於數組索引。事情是這樣的:

box[i].id = i; 

但是我因爲每個我重新排序陣列時使用sort()我已經運行的循環更新id性能與新索引值是不完全滿意。

我的問題是,如果有一種方法可以知道其中的對象索引在數組中,而不必設置id屬性,希望你能幫助我。

在此先感謝。

+1

工作,我想,如果對象的方法需要知道他們的對象的索引,他們不會在對象屬於。它們屬於單例實例或數組。 – staticsan 2011-01-21 03:15:10

回答

19

我不認爲數組中的對象內的函數將會知道引用它的數組的索引。

因爲數組中的每個項目都只是指向內存中的那個對象,所以可能會有幾十個引用同一對象的數組項,變量,對象屬性等,所以函數(或包含函數)不知道你希望創建哪個後端引用。

我猜你會被卡在做你在做什麼,如果你需要知道它在數組中的索引。

我想這個函數可能會調用indexOf()針對Array,因爲它返回index,但是這需要一些開銷,每次調用都需要一些額外的開銷,並且您需要將它添加到不支持的瀏覽器中。

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

爲什麼不在每個對象上添加一個唯一屬性並使用該屬性來查找indexOf Object。

如果你有一個構造函數,你可以添加一個_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

順便說一句,我不喜歡這樣的解決方案,但它會在你的問題:)