2016-07-28 118 views
0

我想从JSON文件中获取数据并将键和值对复制到数组中。 例如:将JSON数据复制到数组中

jsondata = { 
    'Name': {'text': {'name': 'John'}}, 
    'Age': {'number': {'age': '22'}} 
} 

array=[["Name","text","name","John"] 
     ["Age","number","age","22"]] 

这可能吗?

+0

调查'lodash'包。我很确定这个函数有这个功能 –

回答

2

在香草JS也可能是这样的:

data = { 
 
    'Name': {'text': {'name': 'John'}}, 
 
    'Age': {'number': {'age': '22'}} 
 
} 
 

 
function linearize(obj) { 
 
    if (typeof obj !== 'object') 
 
     return [obj]; 
 
    var res = []; 
 
    for (var key in obj) { 
 
     for (var a of linearize(obj[key])) { 
 
      res.push([key].concat(a)) 
 
     } 
 
    } 
 
    return res; 
 
} 
 

 
r = linearize(data) 
 
console.log(r)

+0

这种方法假定嵌套总是2步深,我的代码假设每个嵌套对象只有一个孩子,@ javier的代码假设你可以访问'.map'和'arrow函数',故事的寓意是'lodash'可能已经解决了这种问题:) –

+0

@JasonSperske:'这种方法假定嵌套总是2步深 - 为什么? – georg

+0

完全错过了你的内循环中的递归调用,我的不好。显然,我们都在采用相同的方法,但您的方法更加灵活 –

2

不使用外部库,你可以尝试:

function concatify (json) { 
    return typeof json == "string" ? json : Object.keys(json).reduce((x,y) => x.concat(y).concat(concatify(json[y])), []); 
} 

Object.keys(jsondata).map(k => [k].concat(concatify(jsondata[k]))); 

Object.keys(json).map(k => [k].concat(JSON.stringify(json[k]).replace(/["\{\}]/g,'').split(':')))