85

I need to search inside a json list of countries. The json is like:

[ 
{"name": "Afghanistan", "code": "AF"}, 
{"name": "Åland Islands", "code": "AX"}, 
{"name": "Albania", "code": "AL"}, 
{"name": "Algeria", "code": "DZ"}
]

I get from database only the code and would output the entire name. So if I get "AL" I would like to retrieve from json "Albania"

Penny Liu
17.9k5 gold badges89 silver badges109 bronze badges
asked Oct 8, 2013 at 16:53
9
  • 6
    This is not elance, please provide examples of what you have tried. Commented Oct 8, 2013 at 16:55
  • 13
    @BradChristie The code is valid JSON. Commented Oct 8, 2013 at 16:56
  • 1
    @BradChristie: Can you point out which part is not a valid JSON? jsonlint.com Commented Oct 8, 2013 at 17:01
  • 4
    @BradChristie: Look at json.org, I can't see any quotation marks around... :) Commented Oct 8, 2013 at 17:09
  • 1
    That is valid JSON Format Commented Mar 14, 2017 at 22:40

5 Answers 5

145

I suggest using JavaScript's Array method filter() to identify an element by value. It filters data by using a "function to test each element of the array. Return true to keep the element, false otherwise.."

The following function filters the data, returning data for which the callback returns true, i.e. where data.code equals the requested country code.

function getCountryByCode(code) {
 return data.filter(
 function(data){ return data.code == code }
 );
}
var found = getCountryByCode('DZ');

See the demonstration below:

var data = [{
 "name": "Afghanistan",
 "code": "AF"
}, {
 "name": "Åland Islands",
 "code": "AX"
}, {
 "name": "Albania",
 "code": "AL"
}, {
 "name": "Algeria",
 "code": "DZ"
}];
function getCountryByCode(code) {
 return data.filter(
 function(data) {
 return data.code == code
 }
 );
}
var found = getCountryByCode('DZ');
document.getElementById('output').innerHTML = found[0].name;
<div id="output"></div>

Here's a JSFiddle.

answered Oct 8, 2013 at 17:09
Sign up to request clarification or add additional context in comments.

1 Comment

I know this is answer is over 5 years old, but the statement that it return "only the value for which the callback returns true" is incorrect. It returns an array of objects where the value in each matched object causes the callback to return true. Your code does recognise this, but I feel the statement is misleading
87
var obj = [
 {"name": "Afghanistan", "code": "AF"}, 
 {"name": "Åland Islands", "code": "AX"}, 
 {"name": "Albania", "code": "AL"}, 
 {"name": "Algeria", "code": "DZ"}
];
// the code you're looking for
var needle = 'AL';
// iterate over each element in the array
for (var i = 0; i < obj.length; i++){
 // look for the entry with a matching `code` value
 if (obj[i].code == needle){
 // we found it
 // obj[i].name is the matched result
 }
}
answered Oct 8, 2013 at 16:57

6 Comments

As I stated, it is correct. But just try imagine this list with 100.000 items.
@Tropicalista In fact, you should move the filter logic to your database engine! The DB will always be the fastest when it comes to filtering, ordering or grouping (assuming you set correct indices).
@ivoszz: Except that Array.forEach can be temperamental when it comes to compatibility.
It's missing a coma: for (var i = 0; i < obj.length ; i++){
@jaibalaji not if you support IE. Also keep in mind this post is now going on 5 years old, compatibility has changed.
|
66

Just use the ES6 find() function in a functional way:

var data=[{name:"Afghanistan",code:"AF"},{name:"Åland Islands",code:"AX"},{name:"Albania",code:"AL"},{name:"Algeria",code:"DZ"}];
let country = data.find(el => el.code === "AL");
// => {name: "Albania", code: "AL"}
console.log(country["name"]);

or Lodash _.find :

var data=[{name:"Afghanistan",code:"AF"},{name:"Åland Islands",code:"AX"},{name:"Albania",code:"AL"},{name:"Algeria",code:"DZ"}];
let country = _.find(data, ["code", "AL"]);
// => {name: "Albania", code: "AL"}
console.log(country["name"]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

xinthose
3,9273 gold badges51 silver badges71 bronze badges
answered Jan 16, 2019 at 15:41

Comments

20

First convert this structure to a "dictionary" object:

dict = {}
json.forEach(function(x) {
 dict[x.code] = x.name
})

and then simply

countryName = dict[countryCode]

For a list of countries this doesn't matter much, but for larger lists this method guarantees the instant lookup, while the naive searching will depend on the list size.

answered Oct 8, 2013 at 16:54

3 Comments

um? countryName = dict[code], surely? or am I missing something?
I'm not at all sure it's true that "this method guarantees the instant lookup". Is there any guarantee that the implementation does anything but a sequential lookup? If not, can we be certain that no significant browser implementation does a sequential lookup?
@Auspex This answer is relevant to your question stackoverflow.com/a/28225058/363217
13

Making more general the @showdev answer.

var getObjectByValue = function (array, key, value) {
 return array.filter(function (object) {
 return object[key] === value;
 });
};

Example:

getObjectByValue(data, "code", "DZ" );
Penny Liu
17.9k5 gold badges89 silver badges109 bronze badges
answered Jan 13, 2018 at 18:19

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.