Объединение данных из разных запросов без дубликатов - PullRequest
3 голосов
/ 12 марта 2020

Я получаю данные из трех разных запросов через Api. Я хочу, чтобы данные были объединены без дубликатов данных.

This is my function where i am merging the data:

getStaffCount(data) {
    if (data == null || data.results === null )
        return [];
    else
        return data.results.StaffCount.map(m => ({ Name: m.Name, Accounts: m.Accounts  })).
                    concat(data.results.RepProviderAccount.map(m => ({ Name: m.Name, Accnt: m.Accnt  }))).
                    concat( data.results.ProviderAccount.map(m => ({ Name: m.Name, Account: m.Account })));
}

Это моя таблица:

<PowerTable Data={{ rows: this.getStaffCount(this.props.GridData) }}  rowsPerPage={5} orderBy="Name" order="asc" >
                        <PowerColumn id='Name' columnName='Name' numeric={false} disablePadding={false} label='Profile Name' width={100}>
                        </PowerColumn>
                        <PowerColumn id='Accounts' columnName='Accounts' numeric={false} disablePadding={false} label='Staff Accounts' width={100}>
                        </PowerColumn>
                        <PowerColumn id='Account' columnName='Account' numeric={false} disablePadding={false} label='Provider Account' width={100} >
                        </PowerColumn>
                        <PowerColumn id='Accnt' columnName='Accnt' numeric={false} disablePadding={false} label='Rep Provider Account' width={100} >
                        </PowerColumn>
                    </PowerTable>

This is the output i am getting right now

So in the above image same Profile Name(CNX MSL Platform) is coming twice. So is there any way i can merged those rows?

I want the Output in this way:
 Profile Name                     Staff      Provider      Rep Provider
 Cnx MSl Platform                   2                           1            
 Cnx Specilaity sales Platform      7                           22

Данные: This is my Json Data

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Ваш ответ на мой вопрос о том, как выглядят данные и как их сгруппировать, не имеет никакого смысла, также вы не ответили Джо just showed the json data и не сказали ему , откуда , откуда приходят данные вместо что это.

Итак, я предполагаю, что ваша группа по имени и учетной записи игнорируется. Вы можете сгруппировать их следующим образом:

const data = {
  results: {
    StaffCount: [
      {
        Name: 'a',
        Accounts: 2,
      },
      {
        Name: 'b',
        Accounts: 20,
      },
    ],
    RepProviderAccount: [
      {
        Name: 'a',
        Accnt: 3,
      },
    ],
    ProviderAccount: [
      {
        Name: 'a',
        Account: 1,
      },
    ],
  },
};
const grouped = [
  ...data.results.StaffCount,
  ...data.results.RepProviderAccount,
  ...data.results.ProviderAccount,
].reduce((result, item) => {
  const {
    Name,
    Account = 0,
    Accounts = 0,
    Accnt = 0,
  } = item;
  const existing = result.get(item.Name) || {
    Name,
    Account: 0,
    Accounts: 0,
    Accnt: 0,
  };
  existing.Account += Account;
  existing.Accounts += Accounts;
  existing.Accnt += Accnt;
  return result.set(Name, existing);
}, new Map());
console.log([...grouped.values()]);

Если это не сработает для вас, пожалуйста, обновите свой вопрос и укажите код, как в моем ответе, с ожидаемым вводом и выводом? Вы можете ответить на этот ответ, и я снова посмотрю на ваш вопрос.

На самом деле это может быть проблемой xy, вы выбираете 3 источника данных, а затем пытаетесь сгруппировать и суммировать их, но, возможно, вы можете просто получите 1 источник данных и попробуйте Salesforce сгруппировать и суммировать их в запросе. Я не знаю достаточно о salesforce, но, возможно, вы можете задать еще один вопрос, пометив его с помощью soql, если возможно просто сгруппировать и суммировать данные.

0 голосов
/ 12 марта 2020

Как объект

, если данные являются объектом, простой способ сделать это - оператор распространения

const combinedData = {
  ...dataSrc1,
  ...dataSrc2,
  ...dataSrc3,
}

Все соответствующие ключи будут перезаписаны предыдущим

Как массив

Это немного сложнее. Предполагая, что ваш объект имеет уникальный идентификатор (или любое значение, идентифицирующее 2 как один и тот же элемент), вы можете использовать Set, поскольку они могут иметь только уникальные значения.

const array = [
  ...dataSrc1,
  ...dataSrc2,
  ...dataSrc3,
]
const unique = [...new Set(array.map(item => item.id))];
...