2017-11-16 4 views
0

データの配列を持ち、プロパティのいくつかは配列です。私はその配列を平坦化することを望んでいないので、以下に説明するように配列の配列はありません。JavaScriptを使用した子オブジェクトは、Array(SQLへのnosqlデータ形式)のようにSQLに変換する必要があります

入力

[{ 
    "name": "James", 
    "education": [ 
     { "year": 2014, "degree": "MS" }, 
     { "year": 2012, "degree": "BS" }] 
}, { 
    "name": "Bond", 
    "education": [ 
     { "year": 2011, "degree": "MS" }, 
     { "year": 2009, "degree": "BS" }] 
}] 

出力

[ 
    {"name":"James","education_year":2014,"education_degree":"MS"}, 
    {"name":"James","education_year":2012,"education_degree":"BS"}, 
    {"name":"Bond","education_year":2011,"education_degree":"MS"}, 
    {"name":"Bond","education_year":2009,"education_degree":"BS"} 
] 

https://sqlify.io/convertは、私はそれを頼むときCSV形式に変換することを行います。しかし、私はそのサービスを使用することはできません。

ので、私は、所望の出力を生成Array#map

答えて

1

反復して、要求されたフォーマットで新しいオブジェクトにeducationをマッピングすることができる方法はあります。 spreadArray#concatを使用して結果を平坦化します。

Object#assignを使用してオブジェクトを作成します。アサイン内部、配列#必要なフォーマットに各プロパティをマッピングし、スプレッド:オブジェクト内の複数のサブアレイを扱うことができる

const data = [{ 
 
    "name": "James", 
 
    "education": [ 
 
     { "year": 2014, "degree": "MS" }, 
 
     { "year": 2012, "degree": "BS" }] 
 
}, { 
 
    "name": "Bond", 
 
    "education": [ 
 
     { "year": 2011, "degree": "MS" }, 
 
     { "year": 2009, "degree": "BS" }] 
 
}]; 
 

 
const result = [].concat(...data.map(({ name, education }) => 
 
    education.map(({ year, degree }) => ({ name, education_year: year, education_degree: degree }) 
 
))); 
 

 
console.log(result);

ジェネリックバージョン:

const data = [{"name":"James","lname":"Parker","education":[{"year":2014,"degree":"MS"},{"year":2012,"degree":"BS"}],"job":[{"year":2017,"title":"senior developer"},{"year":2017,"title":"developer"},{"year":2014,"title":"junior"}]},{"name":"Bond","lname":"Peter","education":[{"year":2011,"degree":"MS"},{"year":2009,"degree":"BS"}],"job":[{"year":2014,"title":"ninja"},{"year":2012,"title":"rogue"}]}]; 
 

 
const createKey = (prefix, key) => `${prefix}_${key}`; 
 

 
const result = [].concat(...data.map((el) => 
 
\t Object.entries(el) 
 
    .map(([k, v]) => Array.isArray(v) ? 
 
     v.map((o) => Object.entries(o).reduce((r, [key, val]) => Object.assign(r, { [createKey(k, key)]: val }), {})) 
 
     : 
 
     { [k]: v } 
 
    ) 
 
    \t .reduce((r, s) => 
 
    \t Array.isArray(s) ? 
 
     \t [].concat(...r.map((o) => s.map((q) => Object.assign({}, o, q)))) 
 
     : 
 
     r.map((o) => Object.assign({}, o, s)) 
 
     , [{}]) 
 
)); 
 

 
console.log(result);

+0

この回答を受け入れていただきありがとうございますが、私の問題は、私は膨大な数のプロパティを持っていますoハードコードされたものは動作しません。名前のように、学歴などがありますが、ここから出発していくつかの一般的な機能を作成するのに適した出発点です。私は一度終了します。 – gaurang171

+0

一般的なコードは次のとおりです。https://jsfiddle.net/qnetgvfy/1/ – gaurang171

+0

オブジェクト内の複数のサブ配列を処理できる汎用バージョンで更新されました。 –

関連する問題