Как искать значение в объекте, который содержит подобъекты со значениями массива - PullRequest
0 голосов
/ 12 июля 2020

У меня есть объект json, и я хочу найти в нем ключ и вернуть этот ключ объекта в качестве результата, если ключ совпадает. рассмотрим следующий пример

obj = {
    "India": {
        "Karnataka": ["Bangalore", "Mysore"],
        "Maharashtra": ["Mumbai", "Pune"]
    },
    "USA": {
        "Texas": ["Dallas", "Houston"],
        "IL": ["Chicago", "Aurora", "Pune"]

    }
}
input: Pune
output: ['Maharashtra','IL']

Ответы [ 5 ]

1 голос
/ 12 июля 2020

Вы можете попробовать это -

const obj = {
  "India" : {
    "Karnataka" : ["Bangalore", "Mysore"],
    "Maharashtra" : ["Mumbai", "Pune"]
  },
  "USA" : {
    "Texas" : ["Dallas", "Houston"],
    "IL" : ["Chicago", "Aurora", "Pune"]
  }
};


const search = (obj, keyword) => {
  return Object.values(obj).reduce((acc, curr) => {
      Object.entries(curr).forEach(([key, value]) => {
        if (value.indexOf(keyword) > -1) {
          acc.push(key);
        }
      });
    return acc;
  }, []);
}

console.log(search(obj, 'Pune'));

Это будет искать, существует ли keyword внутри массива. Если тогда пу sh ключ в аккумулятор reduce.

1 голос
/ 12 июля 2020

Предполагая, что ваши данные всегда будут иметь вид страна: состояние: город, вы можете сделать что-то вроде этого. Получите массив ключей следующим образом:

keys = Object.keys(obj);

Затем l oop через каждый ключ:

function classify(input){
res = [];
Object.keys(obj).forEach((key)=>{
   states = obj[key];
   Object.keys(states).forEach((stateKey)=>{
      if(states[stateKey].includes(input)){
         res.push([stateKey,key]);
      }
   })
})
return(res);}

Это также вернет массив со страной:

input: Pune
output: [['Maharashtra','India'],['IL','USA']]
1 голос
/ 12 июля 2020
const input = "Pune"
const result = []
for (v1 in obj) {
  for (v2 in obj[v1]) {
    for (let i = 0; i < obj[v1][v2].length; i++) {
      if (obj[v1][v2][i] === input) {
        result.push([v2][0])
      }
    }
  }
}
0 голосов
/ 12 июля 2020
function isObject (variable) { 

return variable !== undefined && variable !== null && variable.constructor === Object

}

function find(obj,value,keyPath = []){
   let values = Object.values(obj) 
   let keys = Object.keys(obj)
  
   for(let i in values){
      if(isObject (values[i])) {
         find(values[i],value,keyPath )
          
      }else if(Array.isArray(values[i])){
         let foundValue = values[i].find(e=>value==e)
         if(foundValue ){
            keyPath.push(keys[i]) 
         }
      }
   }
   return keyPath 
}
obj = { "India": { "Karnataka": ["Bangalore", "Mysore"], "Maharashtra": ["Mumbai", "Pune"] }, "USA": { "Texas": ["Dallas", "Houston"], "IL": ["Chicago", "Aurora", "Pune"] } }




console.log(find(obj,"Dallas"))

Это должно сработать. Он должен уметь делать любую глубину.

0 голосов
/ 12 июля 2020

Другой способ:

function findCityInState(city) {
  var statesWithCity=[];
  for(country in obj) {
    for(state in obj[country]) {
      if(obj[country][state].includes(city)) {
        statesWithCity.push(state);
      }
    }
  }
  return statesWithCity;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...