-3

i have a json with structure like this

{
  "india": {
    "north_states": ["TN", "AP", "MP", "AB"],
    "south_states": ["PB", "UP", "RJ", "HR"]
  },
  "us": {
    "north_states": ["AC", "AD", "AE", "AF"],
    "south_states": ["BA", "BB", "BC", "BD"]
  },
}

Now if I search for "UP", I have to get south_states and india as reply. how do i do that in JavaScript?

For example:

I need to get the country name based upon the input given in search. for example if i get the input value as 'UP' i need to search the json where UP is and get its key (south_states) and i also need to get the country name as india. the result should take the input of state acronym name and give both the keys as country name and the state_location(south or north)

evolutionxbox
  • 3,932
  • 6
  • 34
  • 51
Nnandan15
  • 7
  • 1
  • 5
  • 1
    Parse the JSON and recursively search the object. – jabaa Mar 09 '22 at 08:22
  • What does mean 'UP'? What does mean `south_states` AND `india`? You expected to get `{india: {south_states: ["PB","UP","RJ","HR"]}}` How you want to get `us` and `north_states`? – EzioMercer Mar 09 '22 at 08:34
  • i need to get the country name based upon the input given in search. for example if i get the input value as UP i need to search the json where UP is and get its key (south_states) and i also need to get the country name as india. the result should take the input of state acronym name and give both the keys as country name and the state_location(south or north) – Nnandan15 Mar 09 '22 at 08:57

2 Answers2

0

I would iterate in this fashion:

the code might need some tweaking, but it works.

this uses recursion, to iterate the JSON to find the objects/array's that match. If the structure of the JSON is fixed, it could be even easier.

const countries = { "india":{"north_states":["TN","AP","MP","AB"],"south_states":["PB","UP","RJ","HR"]}, "us":{"north_states":["AC","AD","AE","AF"],"south_states":["BA","BB","BC","BD"]}, };


function findItems(data, value, pkey){
  let results = [];
  for(let key of Object.keys(data)){
      let newData = data[key];
      if(typeof(newData) == 'string'){
          if(newData == value){
            results.push(pkey);
          }
      } else {
        results = findItems(newData, value, key).concat(results);
      }
  }
  if(results.length > 0 && pkey && results.indexOf(pkey) == -1){
    results.push(pkey);
  }
  return results;
}

let search = findItems(countries, 'UP');

console.info(search);

For a fixed structure, and only on result should be found:

    const countries = { "india":{"north_states":["TN","AP","MP","AB"],"south_states":["PB","UP","RJ","HR"]}, "us":{"north_states":["AC","AD","AE","AF"],"south_states":["BA","BB","BC","BD"]}, };


    function findItems(data, searchTerm){
      let results = [];
      for(let country of Object.keys(data)){
          let stateGroups = data[country];
          for(let stateGroupName of Object.keys(stateGroups)){
            let stateGroup = stateGroups[stateGroupName];
            if(stateGroup.indexOf(searchTerm)!=-1){
              return [country, stateGroupName];
            }
          }
      }
     
    }

    let search = findItems(countries, 'UP');

    console.info(search);
winner_joiner
  • 12,173
  • 4
  • 36
  • 61
0
  1. Parse the JSON into a JS object that you can loop over.

  2. Loop over the main object properties, and then loop over each of those object's properties, and if any of those arrays includes the value you want to match, return the key of the main object, and the key of the inner object.

const json = '{"india":{"north_states":["TN","AP","MP","AB"],"south_states":["PB","UP","RJ","HR"]},"us":{"north_states":["AC","AD","AE","AF"],"south_states":["BA","BB","BC","BD"]}}';

const data = JSON.parse(json);

function check(data, val) {
  for (let key in data) {
    for (let innerkey in data[key]) {
      if (data[key][innerkey].includes(val)) {
        return [key, innerkey];
      }
    }
  }
  return 'No match';
}

console.log(check(data, 'UP'));
console.log(check(data, 'BO'));
console.log(check(data, 'AF'));
Andy
  • 61,948
  • 13
  • 68
  • 95