Как добавить объекты второго массива в первый объект массива на основе значения идентификатора, используя angular6? - PullRequest
0 голосов
/ 20 сентября 2018

Это мой код

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"}];

В указанном выше categories значение идентификатора массива существует в actions массиве.поэтому я хочу объединить два массива в один массив, как показано ниже:

Вывод: -

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"}]}]

Ответы [ 5 ]

0 голосов
/ 20 сентября 2018

Я использую для циклов, работающих нормально.

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]);
     }
   }
}

Любой другой подход без использования циклов?

0 голосов
/ 20 сентября 2018
   // 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)
0 голосов
/ 20 сентября 2018

для каждой категории найдите элементы действия и добавьте их затем к объекту категории

this.categories.forEach((element) => {
    element['actions'] = this.actions.filter((data) => data.category_id === element.id);
});
console.log(this.categories);
0 голосов
/ 20 сентября 2018

Вы можете просто использовать Array.reduce() для создания карты действий, сгруппировать по category Id.А затем вы можете использовать Array.map() по категориям, чтобы получить желаемый результат.Общая временная сложность этого решения будет 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);
0 голосов
/ 20 сентября 2018

используйте функцию карты вместе с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...