简体   繁体   中英

javascript: how to get index of an object in an associative array?

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);   

The above program prints index: -1, why? Is there any better way to get index of an object in an associative array without using loops?

What if I want to delete 'key3' from this array? the splice function takes first parameter as index which must be an integer.

indexOf only works with pure Javascript arrays, ie those with integer indexes. Your "array" is actually an object and should be declared as such

var associativeArray = {}

There's no built-in indexOf for objects, but it's easy to write.

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);
}

Without loops (assuming a modern browser):

foundKeys = Object.keys(associativeArray).filter(function(key) {
    return associativeArray[key] == value;
})

returns an array of keys that contain the given value.

If you don't use jQuery, you could extend the prototype of Object doing this:

// 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;
    }
});

Using this way instead of the common Object.prototype.associativeIndexOf = ... will work with jQuery if you use it.

And then you could use it like this:

var myArray = {...};
var index = myArray.associativeIndexOf(value);

It will also work with normal arrays: [...] , so you could use it instead of indexOf too.

Remember to use the triple-character operators to check if it's undefined:

index === undefined // to check the value/index exists    
index !== undefined // to check the value/index does not exist

Of course you could change the name of the function if you prefer to for example keyOf , and remember not to declare any variable called 'undefined'.

let elementIndex = -1;

array.forEach((element, index, array) => {
   if (element["key"] == "someValue") {
      elementIndex = index;
   }
});

TypeScript Style:

let elementIndex = -1;

this.array.forEach((element, index, array) => {
   if (element.key. == "someValue") {
      elementIndex = index;
   }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM