Mark
Mark

Reputation: 33571

javascript find in array

I have an array like this:

  var movies = [
  { Name: "The Red Violin", ReleaseYear: "1998", Director: "François Girard" },
  { Name: "Eyes Wide Shut", ReleaseYear: "1999", Director: "Stanley Kubrick" },
  { Name: "The Inheritance", ReleaseYear: "1976", Director: "Mauro Bolognini" }
  ];

I want to find the location of the movie that's released in 1999.

Should return 1.

What's the easiest way?

Thanks.

Upvotes: 4

Views: 1191

Answers (6)

Anurag
Anurag

Reputation: 141859

You will have to iterate through each value and check.

for(var i = 0; i < movies.length; i++) {
    if (movies[i].ReleaseYear === "1999") {
        // i is the index
    }
}

Since JavaScript has recently added support for most common collection operations and this is clearly a filter operation on a collection, instead you could also do:

var moviesReleasedIn1999 = movies.filter(function(movie) {
    return movie.ReleaseYear == "1999";
});

assuming you're not interested in the indexes but the actual data objects. Most people aren't anyways :)

.filter is not supported in all browsers, but you can add it yourself to your code base: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter#Compatibility

Upvotes: 6

arnorhs
arnorhs

Reputation: 10429

You'll have to create your own searching function.

Array.prototype.findMovieByYear = function (findYear) {

    for (var i = 0; i < this.length; i++) {
        // this actually returns the element, maybe you just want
        // to return the array index ( the i param )
        if (this[i].Release == findYear) return this[i];
    }

    return null;
    // or return -1 or whatever if you want to return the index

};

// now you can call:
movies.findMovieByYear('1998');
// and that should return
{ Name: "The Red Violin", ReleaseYear: "1998", Director: "François Girard" }

Of course, this way of doing it actually affects every array you create.. which is maybe not what you want.. you can create your own array object then ...

Upvotes: 0

Raynos
Raynos

Reputation: 169373

If functional style programming is applicable:

_.indexOf(_.pluck(movies, "ReleaseYear"), "1999")

Because it's that simple. The functional toolkit that is underscore.js can be very powerful.

_.indexOf , ._pluck

Upvotes: 1

Jonathon Bolster
Jonathon Bolster

Reputation: 15961

Since you've also tagged it with jQuery, you could use the 'map' function:

var movies = $.map(movies,function(item,index){
    return item.ReleaseYear == 1999 ? index : null; 
});

This will return an array of indexes for all movies with the year of 1999. If you wanted the movies themselves as an array:

var movies = $.map(movies,function(item){
    return item.ReleaseYear == 1999 ? item : null; 
});

Upvotes: 2

Felix Kling
Felix Kling

Reputation: 816262

Something like:

function findMovieIndices(movies, prop, value) {
    var result = [];
    for(var i = movies.length; i--; ) {
        if(movies[i][prop] === value) {
            result.push(i); // personally I would return the movie objects
        }
    }
    return result;
}

Usage:

var indices = findMovieIndices(movies, "ReleaseYear", "1999");

Maybe this gives you some idea for a more generalized function (if you need it).

Upvotes: 2

Sean
Sean

Reputation: 786

Built in? Use loops.

You want to get fancy? Linq to Javascript: http://jslinq.codeplex.com/

Upvotes: 2

Related Questions