tengo un json con estructura como esta
{ "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"] }, } Ahora, si busco "UP", tengo que obtener south_states e india como respuesta. ¿Cómo hago eso en JavaScript?
Por ejemplo:
Necesito obtener el nombre del país según la entrada proporcionada en la búsqueda. por ejemplo, si obtengo el valor de entrada como 'UP', necesito buscar el json donde está UP y obtener su clave (estados_sur) y también necesito obtener el nombre del país como india. el resultado debe tomar la entrada del nombre del acrónimo del estado y dar tanto las claves como el nombre del país y la ubicación del estado (sur o norte)
Yo iteraría de esta manera:
el código puede necesitar algunos ajustes, pero funciona.
esto usa recursividad, para iterar el JSON para encontrar los objetos/matrices que coinciden. Si se arregla la estructura del JSON, podría ser aún más fácil.
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);Para una estructura fija, y solo en el resultado, se debe encontrar:
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);Analice el JSON en un objeto JS que puede recorrer.
Recorra las propiedades del objeto principal y luego repita cada una de las propiedades de esos objetos, y si alguna de esas matrices includes el valor que desea hacer coincidir, devuelva la clave del objeto principal y la clave del objeto interno.
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'));