[英]How to add second array objects in first array object based on id value using angular6?
This is my code 这是我的代码
categories = [{"id":"101","name":"category1"},{"id":"102","name":"category2"},{"id":"103","name":"category3"},{"id":"104","name":"category4"}]; actions = [{"id":"201","name":"action1","category_id":"101"},{"id":"202","name":"action2","category_id":"101"},{"id":"203","name":"action3","category_id":"102"},{"id":"204","name":"action4","category_id":"104"}];
In the above categories
array id value is existed in actions
array. 在上述categories
中, actions
数组中存在数组ID值。 so i want to combine the two arrays into one array like the output as follows. 所以我想将两个数组合并为一个数组,如下所示。
Output:- 输出:-
finalList = [{"id":"101","name":"category1","actions":[{"id":"201","name":"action1","category_id":"101"},{"id":"202","name":"action2","category_id":"101"}]},{"id":"102","name":"category2","actions":[{"id":"203","name":"action3","category_id":"102"}]},{"id":"103","name":"category3","actions":[]},{"id":"104","name":"category4","actions":[{"id":"204","name":"action4","category_id":"104"}]}]
use the map function along with the filter
与filter
一起使用地图功能
var categories = [{"id":"101","name":"category1"},{"id":"102","name":"category2"},{"id":"103","name":"category3"},{"id":"104","name":"category4"}]; var actions = [{"id":"201","name":"action1","category_id":"101"},{"id":"202","name":"action2","category_id":"101"},{"id":"203","name":"action3","category_id":"102"},{"id":"204","name":"action4","category_id":"104"}]; var result = categories.map((item) => { item.action = actions.filter( ac => item.id === ac. category_id) return item; }) console.log(result)
for each category find action elements and add then to category object 为每个类别找到操作元素,然后添加到类别对象
this.categories.forEach((element) => {
element['actions'] = this.actions.filter((data) => data.category_id === element.id);
});
console.log(this.categories);
You can simply use Array.reduce()
to create a map of actions ,group by category Id
. 您可以简单地使用Array.reduce()
创建操作映射,按category Id
分组。 And than you can use Array.map()
on the categories to get the desired result. 然后,您可以在类别上使用Array.map()
获得所需的结果。 The overall time complexity of this solution will be O(n)
. 该解决方案的总时间复杂度为O(n)
。
let categories = [{"id":"101","name":"category1"},{"id":"102","name":"category2"},{"id":"103","name":"category3"},{"id":"104","name":"category4"}]; let actions = [{"id":"201","name":"action1","category_id":"101"},{"id":"202","name":"action2","category_id":"101"},{"id":"203","name":"action3","category_id":"102"},{"id":"204","name":"action4","category_id":"104"}]; let map = actions.reduce((a,curr)=>{ (a[curr.category_id] = a[curr.category_id] || []).push(curr); return a; },{}); let result = categories.map((o)=>{ o.actions = map[o.id] || []; return o; }); console.log(result);
// Use simple for loop along with filter
categories = [{"id":"101","name":"category1"},{"id":"102","name":"category2"},{"id":"103","name":"category3"},{"id":"104","name":"category4"}];
actions = [{"id":"201","name":"action1","category_id":"101"},{"id":"202","name":"action2","category_id":"101"},{"id":"203","name":"action3","category_id":"102"},{"id":"204","name":"action4","category_id":"104"}];
for(var i=0;i<categories.length;i++){
categories[i]['actions'] = actions.filter((data) => data.category_id === categories[i].id);
};
console.log(categories)
I am using for loops working fine. 我使用for循环工作正常。
for(var i=0;i<categories.length;i++) { categories[i]["actions"]=[]; for(var j=0;j<actions.length;j++) { if(categories[i].id==actions[j].category_id){ categories[i]["actions"].push(actions[j]); } } }
Any other approach without using for loops? 还有其他没有使用for循环的方法吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.