Сравните два объекта в JavaScript - PullRequest
0 голосов
/ 12 сентября 2018

Я построил объекты следующим образом:

Объект 1

[ { 
   ext: '1287',
   ip: '(Unspecified)',
   queue: [ ]
 } ]

Объект 2

 [ { Queue: '222',
    Members:
     [ {"ext":"1287"},
       {"ext":"4118"} ],
    Callers: [] },

  { Queue: '111',
    Members:
     [ {"ext":"4131"},
       {"ext":"1287"},
       {"ext":"4138"}
     ],
    Callers: [] }]

Я хочу сравнить Object 1 и Object 2. Если значение ext key из Object 1 существует во вложенном объекте Members объекта 2, то значение Queue должно быть помещено в массив очереди, а конечный объект должен быть таким, как показано ниже.

Конечный объект, который я хочу

   [{ ext: '1287',
   ip: '(Unspecified)',
   queue: [222, 111 ] }]

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

Ответы [ 2 ]

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

Раствор без мутаций:

const obj1 = [{ext: '1287',ip: '(Unspecified)',queue: []}];
const obj2 = [{Queue: '222',Members: [{"ext":"1287"},{"ext":"4118"}],Callers: []},{Queue: '111',Members: [{"ext":"4131"},{"ext":"1287"},{"ext":"4138"}],Callers: []}];

const hasExt = ext => o2 => o2.Members.some(m => m.ext === ext)

const result = obj1.map(o1 => {
  const newQueue = obj2
    .filter(hasExt(o1.ext))
    .map(m => m.Queue);
    
  return { ...o1, queue: [...o1.queue, ...newQueue] };
})

console.log(result);
0 голосов
/ 12 сентября 2018

Вы можете попробовать следующее, используя Array.forEach и Array.some

let obj1 = [{ext: '1287',ip: '(Unspecified)',queue: []}];
let obj2 = [{Queue: '222',Members: [{"ext":"1287"},{"ext":"4118"}],Callers: []},{Queue: '111',Members: [{"ext":"4131"},{"ext":"1287"},{"ext":"4138"}],Callers: []}];

obj1.forEach(o => {
  obj2.forEach(v => {
    let exists = v.Members.some(m => m.ext === o.ext);
    if (exists) o.queue.push(v.Queue);
  });
});

console.log(obj1);

Улучшение

Вы можете улучшить производительность, сначала создав map из obj1 с ext как key и object как value. Используйте Array.reduce и Object.assign

let obj1 = [{ext: '1287',ip: '(Unspecified)',queue: []}];
let obj2 = [{Queue: '222',Members: [{"ext":"1287"},{"ext":"4118"}],Callers: []},{Queue: '111',Members: [{"ext":"4131"},{"ext":"1287"},{"ext":"4138"}],Callers: []}];

let map = obj1.reduce((a, c) => Object.assign(a, {[c.ext] : c}), new Map());

obj2.forEach(v => {
  v.Members.forEach(m => {
    if(map[m.ext]) map[m.ext].queue.push(v.Queue);
  });
});

console.log(obj1);
...