如何在对象数组中获取对象的索引?

时间:2011-01-21 03:09:21

标签: javascript arrays object

我有一个像这样的JavaScript对象数组:

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

此对象由相同的构造函数生成,并添加到循环内的数组中。对象在原型中有方法,需要知道数组中对象的索引才能完成它们的工作。目前我正在做的是当我在循环内创建它时,在每个对象中设置一个名为id的属性,等于数组索引。像这样:

box[i].id = i;

但是我对此并不完全满意,因为每次使用sort()重新排序数组时,我都必须运行一个循环来使用新索引值更新id属性。

我的问题是,如果有一种方法可以在对象内部知道数组中的索引,而无需设置id属性,希望你能帮助我。

提前致谢。

2 个答案:

答案 0 :(得分:19)

我认为Array中对象内部的函数不会知道引用它的Array的索引。

因为Array中的每个项目只是指向内存中的那个对象,所以可以想象有几十个引用同一个对象的数组项,变量,对象属性等,所以函数(或包含该函数的对象) )不知道你希望做哪个背面参考。

如果你需要知道它在数组中的索引,我猜你会被困在做你正在做的事情。

我认为该函数可以针对数组调用indexOf(),因为它返回index,但是每次调用都需要一些开销,并且您需要为不支持的浏览器添加它。 / p>

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

答案 1 :(得分:2)

为什么不在每个对象上添加一个唯一属性,并使用该属性来查找该对象的indexOf。

如果你有一个构造函数,你可以添加一个_id,然后使用:

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

即使您对数组进行排序,这也会有效,但您需要保持ID唯一。

IE7或IE8上不提供

Array.prototype.mapES5 Compatibility

顺便说一下,我不喜欢这个解决方案,但它可以解决你的问题:)