2011-01-21 116 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

顺便说一句,我不喜欢这样的解决方案,但它会在你的问题:)