2016-11-29 109 views
1

我正在使用Nodejs。我需要在關係數據庫中存儲JavaScript對象。 JavaScript對象中的每個鍵代表數據庫中的列名稱。我有以下幾點:將JavaScript對象轉換爲要插入到關係數據庫中的數組

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

您可以對組合算法使用迭代和遞歸方法。

這個解決方案基本上遍歷給定的數據(一個數組由對象構成)並且數組內部遍歷這些項。在這種情況下,你有一個包含三個數組的數組。

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

它從第一個數組開始並迭代。這裏只有一個項目和迭代檢查部分長度的回調,並且如果它等於給定的數組長度,則可以找到一個項目。這是退出迭代和將收集的部分推送到結果數組的結果。 (將項目轉換爲減少回調中的對象。)

如果零件數組不具備所需的長度,請繼續處理外圍數組的下一項。

基本上迭代和recusion工作如下

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

如果它是確定使用ES6,發電機可用於通過所有層迭代(不一定更好,不是最可讀的,但我只是喜歡迭代:))

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

感謝您的回答。我想這會比@Nina給出的其他答案更少的時間複雜度,但是這會在節點js中工作嗎? –