thumbnail

JavaScript でオブジェクトの配列の特定のキーの値を使用してオブジェクトに変換する

やりたいこと

const data = [
  {
    id: 1,
    name: 'test1',
  },
  {
    id: 2,
    name: 'test2',
  },
  {
    id: 3,
    name: 'test3',
  },
];

のようなオブジェクトの配列を、idの値をキーとする以下のようなオブジェクトに変換。

const obj = {
  1: {
    id: 1,
    name: 'test1',
  }
  2: {
    id: 2,
    name: 'test2',
  }
  3: {
    id: 3,
    name: 'test3',
  }
}

このように変換しておくことで

2 in obj

で id = 2 のデータがあるかどうかがすぐわかり、また

obj[2]

で id = 2 のデータを簡単に取得可能。

やりかた

// 変換するデータ
const data = [
  {
    id: 1,
    name: 'test1',
  },
  {
    id: 2,
    name: 'test2',
  },
  {
    id: 3,
    name: 'test3',
  },
];

// 変換したデータ
const obj = Object.assign(...data.map(item => ({ [item.id]: item })));

詳細

data.map(item => ({ [item.id]: item })

map は 配列それぞれに変換を適用するために使用するメソッドです。

ここでは item を ({ [item.id]: item }) に変換する関数を適用しています。

これによって

{
  id: 2,
  name: 'test2',
}

{
  2: {
    id: 2,
    name: 'test2',
  }
}

に変換されます。

{ [item.id]: item } という記述は ComputedPropertyName と呼ばれる構文を利用したもので、オブジェクトのプロパティ名を動的に設定できます。

const obj = { [item.id]: item };

は以下と同等ですが、 ComputedPropertyName は一行で記述できる点が大きなメリットです。

const obj = {};
obj[item.id] = item;

Object.assign(…[])

Object.assign は複数のオブジェクトのマージを行います。

「...」 はスプレッド構文と呼ばれ、関数呼び出しで使用することで配列が展開され、それぞれが関数の引数になります。

変換したい配列は前述の data.map によって以下のように変換されています。

[
  {
    1: {
      id: 1,
      name: 'test1',
    }
  },
  {
    2: {
      id: 2,
      name: 'test2',
    }
  },
  {
    3: {
      id: 3,
      name: 'test3',
    }
  },
];

したがって Object.assign(…[]) の個所は以下のように解釈されます。

Object.assign(
  {
    1: {
      id: 1,
      name: 'test1',
    }
  },
  {
    2: {
      id: 2,
      name: 'test2',
    }
  },
  {
    3: {
      id: 3,
      name: 'test3',
    }
  }
);

これによって最終に求めたかったオブジェクトが得られます。

{
  1: {
    id: 1,
    name: 'test1',
  }
  2: {
    id: 2,
    name: 'test2',
  }
  3: {
    id: 3,
    name: 'test3',
  }
}

補足

lodash の keyBy を使用すれば簡単です。

// 変換するデータ
const data = [
  {
    id: 1,
    name: 'test1',
  },
  {
    id: 2,
    name: 'test2',
  },
  {
    id: 3,
    name: 'test3',
  },
];

// 変換したデータ
const obj = _.keyBy(data, 'id');

Makefile で 動的にコマンドを変える方法
next article
arrow