2015-06-18 3 views
0

У меня есть две таблицы базы данных в настоящее время, представляющие отношения «один-к-одному». Действия, имеющие ID (целое число, автоинкремент, первичный ключ) и имя (varchar (255), а не null); и ActivitySlugs, у которых есть идентификатор (такой же, как указано выше), slugname (не null varchar) и activity_id (внешний ключ для Activities.id).Объединить много-к-одному список объектов

В настоящее время я должен получить список всех видов деятельности и все их слизней (как один из списка), так что это выглядит примерно так:

[ 
    {id: 1, name: "long name", slugs: ["nick", "names"]}, 
    {id: 2, name: "foobar", slugs: ["foo", "bar"]} 
] 

Наивного решение (и о единственном один я могу думать) это сделать «SELECT *» на каждом столе, а затем объединить их, но затем я получаю данные, выглядит следующим образом:

activities = [ 
    {id: 1, name: "long name"}, 
    {id: 2, name: "foobar"} 
] 
slugs = [ 
    {id: 1, slugname: "nick", activity_id: 1}, 
    {id: 2, slugname: "names", activity_id: 1}, 
    {id: 3, slugname: "foo", activity_id: 2}, 
    {id: 4, slugname: "bar", activity_id: 2} 
] 

Итак, я могу перебрать и и добавить их :

activities.forEach(function(activity) { 
    slugs = []; 
    activitySlugs.forEach(function(slug) { 
     if (slug.activity_id == activity.id) { 
      slugs.push(slug.name); 
     } 
    }); 
    activity.slugs = slugs; 
); 

Это кажется неуклюжим, медленным и неочищенным. Это, конечно, не будет масштабироваться вообще. К сожалению, я не могу найти лучшего способа заставить их объединиться как много-к-одному с таким массивом.

ответ

2

Вы можете построить карту id2activity, чтобы получить доступ к какой-либо деятельности по его идентификатору:

var id2activity = {}; 
activities.forEach(function(activity) { 
    activity.slugs = []; 
    id2activity[activity.id] = activity; 
); 

activitySlugs.forEach(function(slug) { 
    id2activity[slug.activity_id].slugs.push(slug.name); 
}); 
0

Поскольку слизь может принадлежать только одному действию, вы должны перебирать пули и присоединяться к определенному объекту активности.

var activities = [ 
    {id: 1, name: "long name"}, 
    {id: 2, name: "foobar"} 
]; 
var slugs = [ 
    {id: 1, slugname: "nick", activity_id: 1}, 
    {id: 2, slugname: "names", activity_id: 1}, 
    {id: 3, slugname: "foo", activity_id: 2}, 
    {id: 4, slugname: "bar", activity_id: 2} 
]; 

slugs.forEach(function(slug) { 
    var a = activities.filter(function(a){return a.id==slug.activity_id;}); 
    // should check if it exists - assume that it does 
    if (a[0].slugs == undefined) { 
     a[0].slugs = [slug.id]; 
    } else { 
     a[0].slugs.push(slug.id); 
    } 
});