Как конкатить два объекта с одинаковым идентификатором - PullRequest
0 голосов
/ 10 мая 2019

Как объединить два списка объектов в один список

 var list_1 = [
  {id: 13205, name:'Allan', firstName:'jake'},
  {id: 13210, name:'Douglas', firstName:'jordan'}
 ]

 var list_2 = {13205: [{label:'type', sections: [{label: 'position'}]}]}

Я хотел бы сохранить список "list_1", интегрируя list_2, если они имеют одинаковый идентификатор и тот, что в подобъекте "категории"как это:

var list_1 = [
  {id: 13205, name:'Allan', firstName:'jake', categories : [{label:'type', 
   sections: [{label: 'position'}]}] },
  {id: 13210, name:'Douglas', firstName:'jordan'} 
 ]

Я использовал ES5 и AngularJs

Если у вас есть решение?

Заранее спасибо за ваш ответ

Ответы [ 5 ]

1 голос
/ 10 мая 2019

Вы можете использовать Array.find () и Object.keys () , чтобы извлечь ключ из list_2 следующим образом:

var list_1 = [
  {id: 13205, name:'Allan', firstName:'jake'},
  {id: 13210, name:'Douglas', firstName:'jordan'}
 ]

 var list_2 = {13205: [{label:'type', sections: [{label: 'position'}]}]}
 
 list_1.find(obj => {
  const k = Object.keys(list_2)[0];
  if(obj.id.toString() === k) {
    obj.categories = list_2[k];
    return true;
  }
  return false;
});

console.log(list_1);

Если list_2 содержит несколько идентификаторов:

var list_1 = [
  {id: 13205, name:'Allan', firstName:'jake'},
  {id: 13210, name:'Douglas', firstName:'jordan'}
 ]

 var list_2 = {
   13205: [{label:'type', sections: [{label: 'position'}]}],
   13210: [{label:'type'}]
 }
 
 Object.keys(list_2).forEach(k => { 
   list_1.find(obj => {
     if(obj.id.toString() === k) {
        obj.categories = list_2[k];
        return true;
     }
     return false;
   })
 });

console.log(list_1);
0 голосов
/ 10 мая 2019

Просто получите все идентификаторы list_2, используя Object.keys для итерации ключей list_2.Для каждого ключа используйте array.find на list_1, чтобы найти ссылку элемента, идентификатор которого совпадает с текущим зацикленным.Предполагая, что это число, я добавил безопасное приведение (+i.id и +k. Унарный оператор + приведёт их к числу), чтобы убедиться, что критерии сравнения верны.

Послечто, если какой-либо элемент найден, просто присвойте зацикленное свойство свойству categories.

BEWARE хотя: если list_1 или list_2 равны big ,характеристики find могут не подходить.В этом случае вы должны сначала сделать карту и использовать ее, но это не так.

В качестве последнего примечания, angularjs здесь не нужен.

var list_1 = [
  {id: 13205, name:'Allan', firstName:'jake'},
  {id: 13210, name:'Douglas', firstName:'jordan'}
];
var list_2 = {13205: [{label:'type', sections: [{label: 'position'}]}]};

Object.keys(list_2).forEach(k => {
   const found = list_1.find(i => +i.id === +k);
   if (found) found.categories = list_2[k];
});

console.log(list_1);
0 голосов
/ 10 мая 2019

Просто используйте функцию карты.Вот псевдокод для смешивания с массивом на основе их свойств.В этом примере o.id - это свойство arr2, а item.id - это значение arr1:

var arr1=[...];
var arr2=[...];

arr3 = arr1.map(function(item){ var r=item; return r.category= arr2.filter(o=>o.id==item.id);});
0 голосов
/ 10 мая 2019

Один из способов - перебрать каждый ключ в list_2, а затем проверить, существует ли этот ключ в каждом объекте внутри list_1

var list_1 = [
    {id: 13205, name:'Allan', firstName:'jake'},
    {id: 13210, name:'Douglas', firstName:'jordan'}
]

var list_2 = {13205: [{label:'type', sections: [{label: 'position'}]}]}

Object.keys(list_2).forEach(key => {
    list_1.forEach(obj, index => {
        if (obj.id == key) {
            list_1[index].categories = list_2[key]
        }
    }
})

console.log(list_1);
0 голосов
/ 10 мая 2019

Вы можете использовать map() для list_1 и Object.keys(), чтобы получить значение ключей, затем сравнить ключ с идентификатором.

 var list_1 = [
  {id: 13205, name:'Allan', firstName:'jake'},
  {id: 13210, name:'Douglas', firstName:'jordan'}
 ]

 var list_2 = {13205: [{label:'type', sections: [{label: 'position'}]}]}
 
 const merged = list_1.map((list1, index) => {
  Object.keys(list_2).forEach(keysList2 => {
    if (list1.id == keysList2) {
      list_1[index].section = list_2[list1.id]
    }
  })
  return list1
 })
 
 console.log(merged)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...