【问题标题】:How to search for a value in Object which contains sub objects with as array values如何在包含具有数组值的子对象的对象中搜索值
【发布时间】:2020-07-12 10:48:23
【问题描述】:

我有 json 对象,我想在其中搜索一个键,如果键匹配,则返回该对象键作为结果。考虑下面的例子

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

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

【问题讨论】:

  • 据我所知,没有像通用 JSON 查询命令这样的东西。恐怕您需要手动检查 JSON 数据。
  • @AxD 你的意思是说我们不能通过上面的json格式得到想要的输出吗?
  • @Syed 可以,但你必须自己编写逻辑

标签: javascript json


【解决方案1】:

你可以试试这个-

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 是否存在于数组中。如果然后将密钥推入reduce 累加器。

【讨论】:

    【解决方案2】:
    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])
          }
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      假设您的数据将始终采用 country:state:city 的形式,您可以执行以下操作。获取键的数组如下:

      keys = Object.keys(obj);
      

      然后循环遍历每个键:

      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']]
      

      【讨论】:

        【解决方案4】:

        另一种方法:

        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;
        }
        

        【讨论】:

          【解决方案5】:
          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"))
          

          应该这样做。它应该可以做任何深度。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-09
            • 1970-01-01
            相关资源
            最近更新 更多