2016-07-28 8 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

それはこのようなものが考えられます。

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ステップ深く、私のコードはネストされたオブジェクトごとに1つの子しかないと仮定しています。@ javierのコードは、 '.map'と'物語の道徳は、 'lodash'はおそらくこの種の問題をすでに解決しているでしょう:) –

+0

@JasonSperske:'このアプローチは入れ子が常に2ステップ深いと仮定しています - なぜですか? – georg

+0

あなたの内側forループの再帰呼び出しを完全に逃しました。どうやら私たちは同じアプローチで働いていたのですが、あなたの方が柔軟性があります –

2

外部のライブラリを使用せずに、あなたが試すことができます:バニラJSで

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(':')))