通过Key in JSON查找值

时间:2015-10-27 20:57:38

标签: javascript json

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

if date is None:
    continue

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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是键

答案 1 :(得分:0)

您可以利用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;
}

答案 2 :(得分:0)

谢谢大家的意见。 你激发了我对以下解决方案的启发,我感到非常高兴。

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