JavaScript / TypeScript / jQuery
【JavaScript / groupBy】連想配列のデータをグループにまとめる
「書籍」の情報が入った連想配列を「著者名」別にグルーピングしてみる
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);
[結果]
JavaScriptで、オブジェクトが入った連想配列をグループ分けしてみた