2011-01-21 5 views
9

У меня есть массив объектов JavaScript, как это:Как получить индекс объекта внутри массива объектов?

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

Эти объекты генерируются одним и тем же конструктором и добавить в массив внутри цикла. У объектов есть методы в прототипе, которые должны знать индекс объекта в массиве, чтобы сделать свой материал. В настоящее время то, что я делаю, заключается в установке свойства под названием id внутри каждого объекта, когда я создаю его внутри цикла, равного индексу массива. Что-то вроде этого:

box[i].id = i; 

Однако я не совсем доволен этим, потому что каждый раз, когда я переупорядочить массив, используя sort() я запустить цикл, чтобы обновить id свойства с новыми значениями индекса.

Мой вопрос в том, есть ли способ узнать внутри объекта свой индекс в массиве, без необходимости устанавливать свойство id, надеюсь, что вы можете мне помочь.

Заранее спасибо.

+1

Я думаю, что если методы объекта необходимо знать индекс их объекта, они не принадлежат к объектам. Они принадлежат либо в одном экземпляре, либо в массиве. – staticsan

+0

См. Хороший ответ Патрика. Этот тип связи неизменно приводит к большому разрушению; случай, указанный здесь, является лишь «советом» проблемы. Возможно, есть возможное решение другого (но связанного) вопроса. –

ответ

19

Я не думаю, что функция внутри объекта в массиве будет знать об индексе массива, который ссылается на него.

Поскольку каждый элемент массива просто указывает на этот объект в памяти, возможно, могут быть десятки элементов массива, переменных, свойств объекта и т. Д., Которые ссылаются на тот же объект, поэтому функция (или объект, который содержит функция) не будет знать, какую обратную ссылку вы надеетесь сделать.

Я предполагаю, что вы будете делать то, что делаете, если вам нужно знать его индекс в массиве.

Я полагаю, что функция может назвать indexOf() против массива, поскольку она возвращает index, но это потребует некоторых накладных расходов для каждого вызова, и вы должны будете добавлены его для неподдерживаемых браузеров.

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

Почему бы вам не добавить уникальное свойство для каждого объекта и использовать это свойство для поиска indexOf этого объекта.

Если у вас есть конструктор, вы можете добавить _id, а затем Lookup, что идентификатор с помощью:

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

Это будет работать, даже если вы отсортировать массив, но вы должны держать идентификатор уникальным.

Array.prototype.map не доступен на IE7 или IE8. ES5 Compatibility

кстати, мне не нравится это решение, но он будет работать на вашей проблеме :)

Смежные вопросы