change
change

Reputation: 3558

javascript: get index of object from dictonary key

my data array

data : [
  {
    "name": "Autauga, AL",
    "value": 5.6
  },
  {
    "name": "Baldwin, AL",
    "value": 5.3
  },...
]

How can I retrieve the index of an array object if I just have the name "Autauga, AL"? I am aware of the brute force loops. is there a better way?

Upvotes: 0

Views: 329

Answers (3)

RobG
RobG

Reputation: 147413

You could write a small function to do the job based on Array.prototype.some:

function getIndex(arr, prop, value) {
  var idx;
  arr.some(function(v, i) {
    if (v[prop] == value) {
      idx = i;
      return true;
    }
  });
  return idx;
}

data = [{"name": "Autauga, AL","value": 5.6},
        {"name": "Baldwin, AL","value": 5.3}];

console.log(getIndex(data, 'name', 'Baldwin, AL'));  // 1

some is efficient because it stops when the callback first returns true. You may wisht to adjust the condition to suit.

Upvotes: 0

Mark Reed
Mark Reed

Reputation: 95277

In ECMAScript 5.1+, you can use the Array#filter method to get the actual object:

data.filter(function(item){return item.name == 'Autauga, AL'})[0]

That doesn't get you the index, though. You could do this:

data.map(function(item,index){
  return [item, index]
}).filter(function(a){
  return a[0].name == 'Autauga, AL'
})[0][1]

Those methods still wind up using loops under the covers, but I guess they look cooler..

For efficient access, you could build an index for the target field:

var dataIndexByName = {}, i, len;
for (i=0, len=data.length; i<len; ++i) {
   dataIndexByName[data[i].name] = i
}

After which you can just look for dataIndexByName['Autauga, AL']. That also has the advantage of working in older implementations. It gets a bit more complicated if a given name might show up more than once in the original array, though.

Upvotes: 2

Sam-Graham
Sam-Graham

Reputation: 1360

You could do something like this:

for (var i = 0, len = data.length; i++) {
    if (data[i].name.indexOf("Autauga, AL") > -1) {
        return i;
    }
}

Upvotes: 0

Related Questions