Как получить индекс объекта внутри массива объектов? - PullRequest
9 голосов
/ 21 января 2011

У меня есть массив JavaScript объектов, подобных этому:

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

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

box[i].id = i;

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

У меня вопрос: есть ли способ узнать внутри объекта его index в массиве, не устанавливая свойство id, надеюсь, вы мне поможете.

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

Ответы [ 2 ]

19 голосов
/ 21 января 2011

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

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

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

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

theArr.indexOf( this ); // assuming the function was called from the context
                        //   of the object in question
2 голосов
/ 04 апреля 2014

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

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

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

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

Array.prototype.map недоступно в IE7 или IE8. ES5 Совместимость

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...