次のようなコレクションがあります。
const data = [
{index: 1, number: 's1', uniqId: '123', city: 'LA'},
{index: 2, number: 's2', uniqId: '321', city: 'NY'},
{index: 3, number: 's3', uniqId: '123', city: 'LA'},
{index: 4, number: 's4', uniqId: '111', city: 'TX'},
{index: 5, number: 's5', uniqId: '321', city: 'NY'}
]
以下の結果になるようにグループ化したいと思います。
const data = [
{index: 1, numbers: ['s1', 's3'], uniqId: '123', city: 'LA'},
{index: 2, numbers: ['s2', 's5'], uniqId: '321', city: 'NY'},
{index: 3, number: 's4', uniqId: '111', city: 'TX'},
]
解決策はありますが、よりエレガントな方法で実現できると思います。私はラムダのみを使用できますが、バニラソリューションが推奨されます。これが私の解決策です:
return Object.values(
data.reduce((r, e) => {
const key = `${e.uniqId}|${e.city}`;
if (!r[key]) {
r[key] = e;
if (r[key].numbers && !isEmpty(r[key].numbers)) {
r[key].numbers.push(e.number);
} else {
r[key].numbers = [];
r[key].numbers.push(e.number);
}
} else if (r[key].numbers && !isEmpty(r[key].numbers)) {
r[key].numbers.push(e.number);
} else {
r[key].numbers = [];
r[key].numbers.push(e.number);
}
return r;
}, {}),
).map((item, index) => ({ ...item, index: index }));