2016-04-18 5 views
0

データを平坦化して非正規化しようとしています。私は約束を使ってこれを達成する方法を理解していません。私は何が欠けていますか?約束事を使用して入れ子になったjsonを非正規化する方法は?

私は取得しています結果は次のとおりです。

Bob,Nancy 
Bob,Nancy 

しかし、私は取得したい:

Bob,Sue 
Bob,Nancy 

コード:

var Promise = require('bluebird'); 

var jsonData = { 
    "Parents": [{ 
    "Name": "Bob", 
    "AllChildren": [{ 
     "Name": "Sue" 
    }, { 
     "Name": "Nancy" 
    }] 
    }, { 
    "Name": "Ron", 
    "AllChildren": [{ 
     "Name": "Betty" 
    }, { 
     "Name": "Paula" 
    }] 
    }, { 
    "Name": "Peter", 
    "AllChildren": [{ 
     "Name": "Mary" 
    }, { 
     "Name": "Sally" 
    }] 
    }] 
}; 


var promises = Promise.map(jsonData.Parents, function(parent) { 
    var record = {}; 
    record.ParentName = parent.Name; 
    var allRecords = Promise.map(parent.AllChildren, function(child) { 
    var fullRecord = record; 
    fullRecord.ChildName = child.Name; 
    return fullRecord; 
    }); 
    return Promise.all(allRecords); 
}); 

console.log(JSON.stringify(promises, null, 2)); 

答えて

1

あなたがここで紛失しているのは、その約束が「約束された価値」であり、それがあなたの「それ」とすぐに評価されるということです。プロミスチェーン内で返された値/約束はそれを横断し、次のハンドラによって取り出されます。

UPDATE:フラット化

の変更で使用するCONCATこのような実装:

return Promise.map(jsonData.Parents, function(parent) { 
    return Promise.map(parent.AllChildren, function(child) { 
    return { ParentName: parent.Name, ChildName: child.Name }; 
    }); 
}) 
.reduce(function (accumulator, item){ 
    // Flatten the inner arrays 
    return accumulator.concat(item); 
}, []) 
.then(function (flattened) { 
    console.log(JSON.stringify(flattened, null, 2)); 
}); 
+0

パーフェクト!ありがとうございました。 – Dan

+0

チェーンのどこにでも '.tap(console.log)'を追加することで、すべてのポイントでチェーン値をconsole.logできます。それはあなたが何が起こっているのかをもっと簡単に理解できるようにします。 –

0

あなたが試みる何ができるの約束を使用しません:

jsonData.Parents.reduce(
    function(p, c){ 
     var children = c.AllChildren.map(
         function (item){ 
          return {ParentName:c.Name, ChildName: item.Name}; 
         }); 
     return p.concat(children); 
    }, []); 
関連する問題