合并来自不同查询的数据而不会重复

IT技术 javascript reactjs merge soql
2021-05-05 18:52:33

我通过 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>

这是我现在得到的输出

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

数据: 这是我的 Json 数据

2个回答

作为对象

如果数据是一个对象,那么简单的方法是扩展运算符

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

所有匹配的键都将被之前的键覆盖

作为数组

它有点复杂。假设您的对象具有唯一的 id(或将 2 标识为同一项目的任何值),您可以使用 Set,因为它们只能具有唯一的值。

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

你对我关于数据是什么样子以及如何将它们分组的问题的回答没有任何意义,你也没有回答乔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 标记它,如果有可能只是对数据进行分组和求和。