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"
-
6This is not elance, please provide examples of what you have tried.Mike H.– Mike H.2013年10月08日 16:55:34 +00:00Commented Oct 8, 2013 at 16:55
-
13@BradChristie The code is valid JSON.ComFreek– ComFreek2013年10月08日 16:56:12 +00:00Commented Oct 8, 2013 at 16:56
-
1@BradChristie: Can you point out which part is not a valid JSON? jsonlint.comivoszz– ivoszz2013年10月08日 17:01:38 +00:00Commented Oct 8, 2013 at 17:01
-
4@BradChristie: Look at json.org, I can't see any quotation marks around... :)ivoszz– ivoszz2013年10月08日 17:09:19 +00:00Commented Oct 8, 2013 at 17:09
-
1That is valid JSON FormatMudlabs– Mudlabs2017年03月14日 22:40:07 +00:00Commented Mar 14, 2017 at 22:40
5 Answers 5
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>
1 Comment
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
}
}
6 Comments
Array.forEach can be temperamental when it comes to compatibility.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>
Comments
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.
3 Comments
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" );