web-dev-qa-db-fra.com

Javascript trouver json valeur

Je dois rechercher dans une liste JSON de pays. Le json est comme:

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

Je ne reçois de la base de données que le code et je produisais le nom complet. Donc, si je reçois "AL", j'aimerais récupérer de json "Albania"

29
Tropicalista
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
  }
}
42
Brad Christie

Je suggère d'utiliser la méthode Array de JavaScript filter() pour identifier un élément par sa valeur. Il filtre les données en utilisant une "fonction permettant de tester chaque élément du tableau. Renvoie true pour conserver l'élément, false sinon .."

La fonction suivante filtre les données et renvoie uniquement la valeur pour laquelle le rappel renvoie true, c'est-à-dire où data.code est égal au code de pays demandé.

function getCountryByCode(code) {
  return data.filter(
      function(data){ return data.code == code }
  );
}

var found = getCountryByCode('DZ');

Voir la démonstration ci-dessous:

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>

Voici un JSFiddle .

92
showdev

Commencez par convertir cette structure en objet "dictionnaire":

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

et puis simplement

countryName = dict[countryCode]

Pour une liste de pays, cela n'a pas beaucoup d'importance, mais pour les grandes listes, cette méthode garantit la recherche instantanée, tandis que la recherche naïve dépend de la taille de la liste.

18
georg

Pour rendre plus générale la showdev answer.

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

Exemple:

getObjectByValue(data, "code", "DZ" );
6
Osvaldo Cabrera

Utilisez simplement la fonction ES6 find () de manière fonctionnelle:

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"]);

ou 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>

0
Yi-Ting Liu