2016-04-18 3 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

Вы можете console.log значение цепочки в каждой точке, добавив '.tap (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); 
    }, []); 
Смежные вопросы