Как сгруппировать элементы в массиве объектов разных размеров, сравнивая два разных уникальных свойства?в JavaScript - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть два разных массива объектов, которые я получаю из агрегатной функции, потому что я использую две разные коллекции.

Я пытался использовать функцию карты, как описано здесь, но это не решает мою проблему, что еще я могу сделать, чтобы получить желаемые результаты?

  qrySearch = [{
    sName: 'SomePlace1',
    lBusinessID: 37343,
    SystemID: 5000152
  },
  {
    sName: 'SomePlace2',
    lBusinessID: 39780,
    SystemID: 5000156
  },
  {
    sName: 'SomePlace3',
    lBusinessID: 50772,
    SystemID: 5000519
  },
  {
    sName: 'SomePlace4',
    lBusinessID: 31079,
    SystemID: 5000384
  }
]

и

qrySearchLocID = [{
    LocalLabID: '123f',
    _ID: 'SomePlace1',
    AppLabID: 3,
    count: 15   
  },
  {
    LocalLabID: '12BC',
    _ID: 'SomePlace2',
    AppLabID: 3,
    count: 40
  }
];

после попытки получить только этот массив:

qrySearch = [{
    sName: 'SomePlace1',
    lBusinessID: 37343,
    SystemID: 5000152
  },
  {
    sName: 'SomePlace2',
    lBusinessID: 39780,
    SystemID: 5000156
  },
  {
    sName: 'SomePlace3',
    lBusinessID: 50772,
    SystemID: 5000519
  },
  {
    sName: 'SomePlace4',
    lBusinessID: 31079,
    SystemID: 5000384
  },
]

для простоты я сохранил массив коротким.Мне нужно сравнить _ID, если он совпадает с sName для желаемого результата:

result = [{
        sName: 'SomePlace1',
        lBusinessID: 37343,
        SystemID: 5000152,
        LocalLabID: '123f',
        AppLabID: 3,
        count: 15
      },
      {
        sName: 'SomePlace2',
        lBusinessID: 39780,
        SystemID: 5000156,
        LocalLabID: '12BC',
        AppLabID: 3,
        count: 40
      },
      {
        sName: 'SomePlace3',
        lBusinessID: 50772,
        SystemID: 5000519
      },
      {
        sName: 'SomePlace4',
        lBusinessID: 31079,
        SystemID: 5000384
      }
    ]

Я пробовал использовать этот пример:

var result = qrySearch.map((e, _) => 
          (_ = qrySearchLocID.find((q) => q._ID=== e.sName)) ? 
          { ...e, ...{ _ID: _._ID} } : e);

, но в результатах отсутствует число.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

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

const { flow, concat, groupBy, map, merge, partialRight: pr } = _;

const combine = flow(
  concat,
  pr(groupBy, o => o.sName || o._ID),
  pr(map, g => merge({}, ...g))
);

const qrySearch = [{"sName":"SomePlace1","lBusinessID":37343,"SystemID":5000152},{"sName":"SomePlace2","lBusinessID":39780,"SystemID":5000156},{"sName":"SomePlace3","lBusinessID":50772,"SystemID":5000519},{"sName":"SomePlace4","lBusinessID":31079,"SystemID":5000384}];

const qrySearchLocID = [{"LocalLabID":"123f","_ID":"SomePlace1","AppLabID":3,"count":15},{"LocalLabID":"12BC","_ID":"SomePlace2","AppLabID":3,"count":40}];

const result = combine(qrySearch, qrySearchLocID);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

И та же идея, используя lodash / fp :

const { flow, concat, groupBy, map, mergeAll, propOr } = _;

const combine = flow(
  concat,
  groupBy(o => o.sName || o._ID),
  map(mergeAll)
);

const qrySearch = [{"sName":"SomePlace1","lBusinessID":37343,"SystemID":5000152},{"sName":"SomePlace2","lBusinessID":39780,"SystemID":5000156},{"sName":"SomePlace3","lBusinessID":50772,"SystemID":5000519},{"sName":"SomePlace4","lBusinessID":31079,"SystemID":5000384}];

const qrySearchLocID = [{"LocalLabID":"123f","_ID":"SomePlace1","AppLabID":3,"count":15},{"LocalLabID":"12BC","_ID":"SomePlace2","AppLabID":3,"count":40}];

const result = combine(qrySearch, qrySearchLocID);

console.log(result);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
0 голосов
/ 15 февраля 2019

Вы можете просто распределить свой заполнитель _, чтобы объединить значения

const qrySearch = [{
    sName: 'SomePlace1',
    lBusinessID: 37343,
    SystemID: 5000152
  },
  {
    sName: 'SomePlace2',
    lBusinessID: 39780,
    SystemID: 5000156
  },
  {
    sName: 'SomePlace3',
    lBusinessID: 50772,
    SystemID: 5000519
  },
  {
    sName: 'SomePlace4',
    lBusinessID: 31079,
    SystemID: 5000384
  },
];

const qrySearchLocID = [{
    LocalLabID: '123f',
    _ID: 'SomePlace1',
    AppLabID: 3,
    count: 15


  },
  {
    LocalLabID: '12BC',
    _ID: 'SomePlace2',
    AppLabID: 3,
    count: 40
  },
];

var res = qrySearch.map((e, _) => 
          (_ = qrySearchLocID.find((q) => q._ID=== e.sName)) ? 
          { ...e, ..._ }: e);
console.log(res);
...