【问题标题】:How to get the index of an object inside an array of objects?如何获取对象数组中对象的索引?
【发布时间】:2011-01-21 03:09:21
【问题描述】:

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

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

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

box[i].id = i;

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

我的问题是,是否有办法在对象内部知道它在数组中的 index,而无需设置 id 属性,希望您能帮助我。

提前致谢。

【问题讨论】:

  • 我认为如果对象方法需要知道其对象的索引,它们不属于对象。它们要么属于单例实例,要么属于数组。
  • 查看 patrick 的好答案。这种类型的耦合总是会导致很多失败。指出的案例只是问题的“提示”。也许对于不同(但相关)的问题有可行的解决方案。

标签: javascript arrays object


【解决方案1】:

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

因为 Array 中的每个项目都只是指向内存中的那个对象,所以可以想象有几十个 Array 项目、变量、对象属性等引用同一个对象,所以函数(或包含函数的对象) ) 不知道您希望使用哪个反向引用。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 2014-05-14
      • 2017-10-23
      • 2020-05-04
      • 1970-01-01
      • 2017-06-16
      • 2018-04-25
      • 2014-11-30
      相关资源
      最近更新 更多