Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【javascrpt】多次元配列の同じキーをまとめたい

解決したいこと

Javascrptの多次元配列を作成したいがどうやって作成したらいいのか分からないので教えて頂きたいです。

ーーーーーーーーーーーーーーー
プロジェクト 0001
名前 AA AA
4月 5時間
ーーーーーーーーーーーーーーー
プロジェクト 0001
名前 AA AA
5月 5時間 
ーーーーーーーーーーーーーーー
プロジェクト 0001
名前 BB BB
5月 3時間 
ーーーーーーーーーーーーーーー
プロジェクト 0001
名前 BB BB
6月 3時間 
ーーーーーーーーーーーーーーー
プロジェクト 0002
名前 AA AA
4月 7時間 
ーーーーーーーーーーーーーーー
プロジェクト 0002
名前 AA AA
5月 7時間 
ーーーーーーーーーーーーーーー

ツールから以上の情報を取得すると下記のような配列が取得できます。
これをprojectとnameが一致しているものを一緒にまとめたいのですがやり方が分かりません。
お手数おかけしますが、教えて頂けないでしょうか?

var array =[
{project: '0001',name:'AA AA',April:'5'},
{project: '0001',name:'AA AA',May:'5'},
{project: '0001',name:'BB BB',May:'3'},
{project: '0001',name:'BB BB',June:'3'},
{project: '0002',name:'AA AA',April:'7'},
{project: '0002',name:'AA AA',May:'7'},
]

下記の通り、
projectとnameをキーとして、稼働がない月には0が入るようにしたいです。

var array =[
{project: '0001',name:'AA AA',April:'5',May:'5',June:'0'},
{project: '0001',name:'BB BB',April:'0',May:'3',June:'3'},
{project: '0002',name:'AA AA',April:'7',May:'7',June:'0'},
]

自分で試したこと

実装方法をいろいろ試しまたが分かりませんでした。

0 likes

1Answer

とりあえず、思いついた方法で組んでみました。

const array = [
  {project: '0001',name:'AA AA',April:'5'},
  {project: '0001',name:'AA AA',May:'5'},
  {project: '0001',name:'BB BB',May:'3'},
  {project: '0001',name:'BB BB',June:'3'},
  {project: '0002',name:'AA AA',April:'7'},
  {project: '0002',name:'AA AA',May:'7'},
];

const result = {};

for(const e of array) {
  const compositeKey = `${e.project}:${e.name}`;

  if(!result[compositeKey]) result[compositeKey] =
    {project: '', name: '', April: '0', May: '0', June: '0'};

  Object.assign(result[compositeKey], e);
}

console.log(Object.values(result));
/*
[
  { project: '0001', name: 'AA AA', April: '5', May: '5', June: '0' },
  { project: '0001', name: 'BB BB', April: '0', May: '3', June: '3' },
  { project: '0002', name: 'AA AA', April: '7', May: '7', June: '0' }
]
*/
1Like

Your answer might help someone💌