2015-12-06 4 views
0

Я пытаюсь объединить два массива на основе ключа «parent_id». Вот массивы и требуемый выход:Объединить 2 массива на основе ключа javascript

Массив 1: Элемент группы:

var itemGroups = [ 
    { 
    "id":1, 
    "value":"Item Group 1", 
    "order":1 
    }, 
    { 
    "id":4, 
    "value":"Item Group 2", 
    "order":2 
    }, 
    { 
    "id":12, 
    "value":"Item Group 3", 
    "order":4 
    } 
]; 

Массив 2: элементы, которые в группах:

var itemChildren = [ 
    { 
    "id":68, 
    "value":"An example item from Group 1", 
    "parent_id":1 
    }, 
    { 
    "id":69, 
    "value":"An example item from Group 2", 
    "parent_id":4 
    } 
    { 
    "id":76, 
    "value":"An example item from Group 3", 
    "parent_id":12 
    } 
]; 

Нужный выход:

var itemGroupsWithChildren = [ 
    { 
    "id":1, 
    "value":"Item Group 1", 
    "order":1, 
    "children":[ 
     { 
     "id":68, 
     "value":"An example item from Group 1", 
     }  
    ] 
    }, 
    { 
    "id":4, 
    "value":"Item Group 2", 
    "order":2, 
    "children":[ 
     { 
     "id":69, 
     "value":"An example item from Group 2" 
     }  
    ] 
    }, 
    { 
    "id":12, 
    "value":"Item Group 3", 
    "order":4, 
    "children":[ 
     { 
     "id":76, 
     "value":"An example item from Group 3" 
     }  
    ] 
    } 
]; 

Любая помощь была бы принята с благодарностью. Благодарю.

EDITED:

var dataServiceGroups = [ 
    {"id":65,"value":"Group 1","order":1,"picklist_id":12}, 
    {"id":118,"value":"Group 2","order":2,"picklist_id":12}, 
    {"id":120,"value":"Group 2","order":4,"picklist_id":12}, 
    {"id":222,"value":"Group 3","order":3,"picklist_id":12}, 
    {"id":223,"value":"Group 4","order":5,"picklist_id":12}, 
    {"id":224,"value":"Group 5","order":6,"picklist_id":12}, 
    {"id":225,"value":"Group 6","order":7,"picklist_id":12}, 
    {"id":226,"value":"Group 7","order":8,"picklist_id":12}, 
    {"id":227,"value":"Other Group","order":9,"picklist_id":12} 
]; 

var dataServices = [ 
    {"id":68,"value":"Item From Group 1","order":3,"picklist_id":13,"parent_id":65}, 
    {"id":228,"value":"Other Service","order":4,"picklist_id":13,"parent_id":227} 
]; 
+0

Можно ли предположить, как Ричард делает ниже, что два входных массива упорядочены одинаково? –

+0

Привет, Саймон, я не уверен, что вы имеете в виду, хотя реакция Ричарда, похоже, не работает над моими фактическими данными. Я обновил вопрос с данными ближе к тому, что я использую в своем приложении, поскольку я явно что-то пропустил. – Aymur

+0

После дальнейших исследований порядок важен. По сути, дети должны быть сопоставлены с помощью ключа «parent_id». – Aymur

ответ

0

Я предлагаю вам преобразовать массив 2 в объект, так что вы можете найти, что в нем легко, а затем использовать его для map array 1 в нужный результат.

Посмотрите на следующий

var itemC = {} 
 

 
itemChildren.forEach(function(child) { 
 
    var tmp = {}; 
 
    tmp['id'] = child.id; 
 
    tmp['value'] = child.value; 
 
    itemC[child.parent_id] = tmp 
 
}); 
 
    
 

 
var desiredOutput = itemGroups.map(function(item) { 
 
    item[children] = itemC[item.id]; 
 
    return item; 
 
})

+0

Кажется, это работало. Спасибо, Саймон – Aymur

0

Это будет выглядеть примерно так

itemGroups.map(function(object, index) { 
    object["children"] = itemChildren[index]; 
}); 
0

Создать сгруппированный массив для детей, а затем добавить к объектам группы:

var groupedChildren = []; 

itemChildren.forEach(function(item) { 
    var parentID = item.parent_id;  

    //Create the array for the group by parent id 
    if(typeof groupedChildren[parentID] == "undefined") { 
     groupedChildren[parentID] = []; 
    } 
    groupedChildren[parentID].push(item); 
}); 

//Now add the grouped children to itemGroups 
var itemGroupsWithChildren = itemGroups.map(function(group) { 
    group['children'] = groupedChildren[group.id] || []; //put empty array if no children 
    return group; 
}); 
Смежные вопросы