通过JSON中的Key查找值

Finding values by Key in JSON

本文关键字:查找 Key 中的 JSON 通过      更新时间:2023-09-26

给定一个任意结构和混合值类型的反序列化JSON对象。。。

var data = {
  'a':'A1',
  'b':'B1',
  'c': [
    {'a':'A2', 'b':true}, 
    {'a':'A3', 'b': [1, 2, 3]}
  ]};

我想返回一个与给定键匹配的值数组。

> my_func(data, 'a')
['A1', 'A2', 'A3']
> my_func(data, 'b')
['B1', true, [1, 2, 3]]

我得到的最接近的是这个,它给出了正确的结果,但我认为有一个更好(更快/更整洁/更高效)的解决方案。

my_func = function(o,s,a){
    var a = a || [];
    if(o == null){
        return a;
    }
    if(s in o){
        a.push(o[s]);
    }
    for(e in o){
        if(typeof(o[e]) == "object"){
            a.concat(my_func(o[e], s, a))
        }
    }
    return a;
}

有什么想法吗?

function traverse(obj,func, parent) {
  for (i in obj){
    func.apply(this,[i,obj[i],parent]);      
    if (obj[i] instanceof Object && !(obj[i] instanceof Array)) {
      traverse(obj[i],func, i);
    }
  }
}
function getPropertyRecursive(obj, property){
  var acc = [];
  traverse(obj, function(key, value, parent){
    if(key === property){
      acc.push({parent: parent, value: value});
    }
  });
  return acc;
}

像这样称呼这个

getPropertyRecursive( myobj, 'test' )

其中myobj是嵌套对象,test是关键

您可以利用replacer参数到JSON.stringify:

function my_func(data, prop) {
  var result = [];
  JSON.stringify(data, function(key, val) {
    if (key === prop) result.push(val);
    return val;
  });
  return result;
}

感谢大家的投入。你激发了我对以下解决方案的灵感,我对此感到非常高兴。

walk_obj = function(o, fn){
    for(k in o){
        fn(k, o[k]);
        if(typeof(o[k]) == "object"){
            walk_obj(o[k], fn);
        }
    }
}
get_by_key = function(o, key){
    var a = [];
    walk_obj(o, function(k,v){
        if(k==key){
            a.push(v);
        }
    })
    return a;
}