2016-11-29 5 views
1

私はNodejsを使用しています。私はリレーショナルデータベースにJavaScriptオブジェクトを格納する必要があります。 JavaScriptオブジェクトの各キーは、DBの列名を表します。私は、次のしている:JavaScriptオブジェクトをリレーショナルDBに挿入する配列に変換します

var data = { 
    "aa": "99", 
    "bb": ["11","22"], 
    "cc": ["44","55","66"] 
} 

私は次のように配列にこのオブジェクトを変換したい:

data = [ 
    { 
    "aa": "99", 
    "bb": "11", 
    "cc": "44" 
    }, 
    { 
    "aa": "99", 
    "bb": "11", 
    "cc": "55" 
    }, 
    { 
    "aa": "99", 
    "bb": "11", 
    "cc": "66" 
    }, 
    { 
    "aa": "99", 
    "bb": "22", 
    "cc": "44" 
    }, 
    { 
    "aa": "99", 
    "bb": "22", 
    "cc": "55" 
    }, 
    { 
    "aa": "99", 
    "bb": "22", 
    "cc": "66" 
    } 
    ] 

これを行うにはどのような方法がありますか?私は再帰的に使うことができると思います。しかし、Googleでは参照を見つけることができませんでした。

答えて

1

組み合わせアルゴリズムを使用して反復的および再帰的アプローチを使用できます。

この解決策は、基本的に、指定されたデータ(配列はオブジェクトから作成されます)を繰り返し実行し、配列内でアイテムを繰り返し処理します。この場合、アイテムには3つの配列を持つ配列があります。

[ 
    ["99"], 
    ["11","22"], 
    ["44","55","66"] 
] 

最初の配列から始まり、繰り返します。ここでは1つの項目のみがあり、部分長のiteratonチェックのコールバックがあり、指定された配列の長さと等しい場合は、al itemが見つかる。これは、反復adnを終了して、収集された部分を結果配列にプッシュするという条件です。

部分配列に必要な長さがない場合は、外側の配列の次の項目に進みます(この項目は縮小コールバックでオブジェクトに変換されます)。それはES6を使用しても大丈夫だ場合

part  0  1  2 action 
     ------ ----- ----- --------------- 
      99     go to next level 
      99  11   go to next level 
      99  11  44 push to result, end level 2 
      99  11  55 push to result, end level 2 
      99  11  66 push to result, end level 2 
      99  11   end level 1 
      99  22   go to next level 
      99  22  44 push to result, end level 2 
      99  22  55 push to result, end level 2 
      99  22  66 push to result, end level 2 
      99  22   end level 1 
      99     end level 0 

function combine(object) { 
 
    function c(part) { 
 
     array[part.length].forEach(function (a) { 
 
      var p = part.concat(a); 
 
      if (p.length === array.length) { 
 
       result.push(p.reduce(function (r, b, i) { 
 
        r[keys[i]] = b; 
 
        return r; 
 
       }, {})); 
 
       return; 
 
      } 
 
      c(p); 
 
     }); 
 
    } 
 

 
    var keys = Object.keys(object), 
 
     array = keys.map(function (k) { return Array.isArray(object[k]) ? object[k] : [object[k]]; }), 
 
     result = []; 
 

 
    c([]); 
 
    return result; 
 
} 
 

 
var data = { aa: "99", bb: ["11", "22"], cc: ["44", "55", "66"] }, 
 
    result = combine(data); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

素晴らしい!私は論理を理解しませんでしたが、これは動作します。迅速な答えをありがとう。 –

1

に従うよう

は基本的に反復してrecusion作品、発電機が必ずしも良く(すべての層を反復処理するために使用することができ、最も読みやすいものではありませんが、私はイテレータが好きです:))

function flatten(data) { 
 
    const getArr = a => Array.isArray(a) ? a: [a], 
 
    keyData = Object.keys(data).map(k=>({name:k,arr:getArr(data[k])})), 
 
    getobj = function*(i) { 
 
     for(let p of keyData[i].arr) 
 
      for(let o of i===keyData.length -1 ? [{}] : getobj(i+1)){ 
 
      \t o[keyData[i].name] = p; 
 
       yield o; 
 
      }  \t \t 
 
     } 
 
     return [...getobj(0)];  
 
} 
 

 

 
let data = { aa: "99", bb: ["11", "22"], cc: ["44", "55", "66"] }; 
 

 
console.log(flatten(data));

+0

お返事ありがとうございます。私はこれが@ニーナによって与えられた他の答えよりも時間の複雑さが少ないと思うが、これはノードjsでうまくいくだろうか? –

関連する問題