私は次の辞書の配列を持っています:
[{name:'g1', variant:'v1', count:1},{name:'g2', variant:'v1', count:2}, {name:'g1', variant:'v1', count:2}, {name:'g2', variant:'v1', count:2}]
配列が指定された辞書の新しいリストを作成したいので['name', 'variant']
、2つの辞書が配列で指定されたキーの値が同じである場合、対応するカウントは次のように合計されます。
[{name:'g1', variant:'v1', count:3},{name:'g2', variant:'v1', count:4}]
Javascriptでこれを実現するにはどうすればよいですか?
reduce
メソッドを使用してグループ化し、合計することができますcount
:
const result = arr.reduce((a, {name, variant, count}) => {
a[name] = a[name] || {name, variant, count: 0};
a[name].count += count;
return a;
}, {})
例:
let arr = [
{name:'g1', variant:'v1', count:1},
{name:'g2', variant:'v1', count:2},
{name:'g1', variant:'v1', count:2},
{name:'g2', variant:'v1', count:2}
];
const result = arr.reduce((a, {name, variant, count}) => {
a[name] = a[name] || {name, variant, count: 0};
a[name].count += count;
return a;
}, {})
console.log(Object.values(result))
更新:
name
やなどの複数のプロパティでグループ化する場合はvariant
、次を使用できます。
const result = [...arr.reduce((r, o) => {
const key = o.name + '-' + o.variant;
const item = r.get(key) || Object.assign({}, o, {
count: 0
});
item.count += +o.count;
return r.set(key, item);
}, new Map).values()];
例:
let arr = [
{name:'g1', variant:'v1', count:1},
{name:'g2', variant:'v1', count:2},
{name:'g1', variant:'v1', count:2},
{name:'g2', variant:'v1', count:2}
];
const result = [...arr.reduce((r, o) => {
const key = o.name + '-' + o.variant;
const item = r.get(key) || Object.assign({}, o, {
count: 0
});
item.count += +o.count;
return r.set(key, item);
}, new Map).values()];
console.log(result);
キーをハードコーディングしない場合:
let firstKey = 'name', secondKey = 'variant', thirdKey = 'count';
const result = [...arr.reduce((r, o) => {
const key = o[firstKey] + '-' + o[secondKey];
const item = r.get(key) || Object.assign({}, o, {
[thirdKey]: 0
});
item[thirdKey] += +o[thirdKey];
return r.set(key, item);
}, new Map).values()];
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加