5

I'm having trouble figuring out how to set a property dynamically in underscore.js while using the _.findWhere function.

Here's the documentation for the function:

findWhere_.findWhere(list, properties) 

Looks through the list and returns the first value that matches all of the key-value pairs listed in properties.

If no match is found, or if list is empty, undefined will be returned.

_.findWhere(publicServicePulitzers, {newsroom: "The New York Times"});
=> {year: 1918, newsroom: "The New York Times",
reason: "For its public service in publishing in full so many official reports,
documents and speeches by European statesmen relating to the progress and
conduct of the war."}

Modeling the example in the docs, I want to set the property to search for dynamically:

 var publicServicePulitzers = [
    {"newsroom":"The New York Times", "year":2013 },
    {"newsroom":"The Los Angeles Times", "year":2012 }
 ];

var myprop = 'newsroom';
_.findWhere(publicServicePulitzers, { myprop : "The New York Times"});

The result is undefined.

I also tried:

_.findWhere(publicServicePulitzers, {eval(myprop): "The New York Times"});

The error message is SyntaxError: missing : after property id

How can I accomplish this?

Thanks for any help.

Timothy Barmann
  • 598
  • 7
  • 17

2 Answers2

8

Just figured it out. The second parameter to findWhere is an object. So create the object first and pass that to the function:

var myprop = 'newsroom';
var value = 'The New York Times';
var search_obj = {};
search_obj[myprop] = value;

var result =  _.findWhere(publicServicePulitzers,search_obj);

Works!

Timothy Barmann
  • 598
  • 7
  • 17
  • Right but keep in mind that `findWhere` is really just a `find` call in disguise so building the `search_obj` for a single value doesn't do that much for you (or maybe it does depending on your tastes :). – mu is too short Jan 09 '14 at 01:08
3

Don't use findWhere for this, but a more generic find:

_.find(publicServicePulitzers, function(prize) {
    return price[myprop] == "The New York Times";
});

If you really need to use findWhere, have a look at Using a variable for a key in a JavaScript object literal.

Community
  • 1
  • 1
Bergi
  • 630,263
  • 148
  • 957
  • 1,375