给定一个任意结构和混合值类型的反序列化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]]
有什么想法吗?
答案 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;
}