【JavaScript / groupBy】連想配列のデータをグループにまとめる

カレー

JavaScriptで、オブジェクトが入った連想配列をグループ分けしてみた

「書籍」の情報が入った連想配列を「著者名」別にグルーピングしてみる

const books = [
  { id: 1, name: '夜は短し歩けよ乙女', author: '森見登美彦' },
  { id: 2, name: 'ノルウェイの森', author: '村上春樹' },
  { id: 3, name: '三毛猫ホームズの推理', author: '赤川次郎' },
  { id: 4, name: 'ねじまき鳥クロニクル', author: '村上春樹' },
  { id: 5, name: '有頂天家族', author: '森見登美彦' },
  { id: 6, name: '恋文の技術', author: '森見登美彦' },
]

const groupBy = function(xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
      return rv;
   }, {});
};

const booksGroubByAuthor = groupBy(books, 'author');

console.log (booksGroubByAuthor)
[結果]

著作者で分けたグループを紐づく本の多さ順にソートしたい場合

 const books = [
  { id: 1, name: '夜は短し歩けよ乙女', author: '森見登美彦' },
  { id: 2, name: 'ノルウェイの森', author: '村上春樹' },
  { id: 3, name: '三毛猫ホームズの推理', author: '赤川次郎' },
  { id: 4, name: 'ねじまき鳥クロニクル', author: '村上春樹' },
  { id: 5, name: '有頂天家族', author: '森見登美彦' },
  { id: 6, name: '恋文の技術', author: '森見登美彦' },
]

const groupBy = function(xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
      return rv;
   }, {});
};

const booksGroubByAuthor = groupBy(books, 'author');

const booksSortByLength = Object.keys(booksGroubByAuthor)
  .map(function(k) { return { key: k, value: booksGroubByAuthor[k] }; })
  .sort(function(a, b) { return b.value.length - a.value.length; });

console.log(booksSortByLength);
[結果]