Javascript: как получить индекс объекта в ассоциативном массиве?
var associativeArray = [];
associativeArray['key1'] = 'value1';
associativeArray['key2'] = 'value2';
associativeArray['key3'] = 'value3';
associativeArray['key4'] = 'value4';
associativeArray['key5'] = 'value5';
var key = null;
for(key in associativeArray)
{
console.log("associativeArray[" + key + "]: " + associativeArray[key]);
}
key = 'key3';
var obj = associativeArray[key];
// gives index = -1 in both cases why?
var index = associativeArray.indexOf(obj);
// var index = associativeArray.indexOf(key);
console.log("obj: " + obj + ", index: " + index);
Вышеуказанная программа печатает индекс: -1, почему? Есть ли лучший способ получить индекс объекта в ассоциативном массиве без использования циклов?
Что делать, если я хочу удалить 'key3' из этого массива? функция splice принимает первый параметр как индекс, который должен быть целым числом.
Ответы
Ответ 1
indexOf
работает только с чистыми массивами Javascript, т.е. с целыми индексами. Ваш "массив" на самом деле является объектом и должен быть объявлен как таковой
var associativeArray = {}
Нет встроенного indexOf для объектов, но его легко написать.
var associativeArray = {}
associativeArray['key1'] = 'value1';
associativeArray['key2'] = 'value2';
associativeArray['key3'] = 'value3';
associativeArray['key4'] = 'value4';
associativeArray['key5'] = 'value5';
var value = 'value3';
for(var key in associativeArray)
{
if(associativeArray[key]==value)
console.log(key);
}
Без циклов (при использовании современного браузера):
foundKeys = Object.keys(associativeArray).filter(function(key) {
return associativeArray[key] == value;
})
возвращает массив ключей, содержащих заданное значение.
Ответ 2
Если вы не используете jQuery, вы можете расширить прототип объекта:
// Returns the index of the value if it exists, or undefined if not
Object.defineProperty(Object.prototype, "associativeIndexOf", {
value: function(value) {
for (var key in this) if (this[key] == value) return key;
return undefined;
}
});
Использование этого способа вместо обычного Object.prototype.associativeIndexOf = ...
будет работать с jQuery, если вы его используете.
И тогда вы можете использовать его следующим образом:
var myArray = {...};
var index = myArray.associativeIndexOf(value);
Он также будет работать с обычными массивами: [...]
, поэтому вы можете использовать его вместо indexOf
.
Не забудьте использовать трехсимвольные операторы, чтобы проверить, не ли это undefined:
index === undefined // to check the value/index exists
index !== undefined // to check the value/index does not exist
Конечно, вы можете изменить имя функции, если вы предпочитаете, например, keyOf
, и не забудьте объявить любую переменную с именем "undefined".