Подтвердить что ты не робот

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 принимает первый параметр как индекс, который должен быть целым числом.

4b9b3361

Ответ 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".