Q209124

by jun68ykt

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
<div id="test"></div>

JavaScript

var arr = [
  ["a","a","a",1,"2019/01/01"],
  ["a","b","a",1,"2019/01/01"],
  ["b","a","a",1,"2019/01/01"],
  ["a","a","c",1,"2019/01/01"],
  ["c","a","c",1,"2019/01/01"],
  ["b","b","b",1,"2019/01/01"],
  ["b","b","a",1,"2019/01/01"],
  ["c","a","c",1,"2019/07/01"],
  ["b","a","b",1,"2019/01/01"],
  ["a","a","a",1,"2019/02/02"]
];

// カテゴリ1,2,3をスラッシュを区切りとして連結した文字列をキーにグループ化したオブジェクトを得て、それのエントリ配列を取得
var groupedEntries = Object.entries(_.groupBy(arr, ary => ary.slice(0,3).join('/')));

// 各キーに対して、日付が最新の要素を値とするマップを作成
var keyToNewestDateMap = groupedEntries.reduce(
  (map, [key, arrays]) => map.set(key, _.maxBy(arrays, ary => ary[4])), new Map());

// 上記で作成したマップのエントリから、キー(カテゴリを / で連結した文字列)でソートされた、値の配列を取得
var arr2 = [...keyToNewestDateMap]
  .sort(([key1], [key2]) => key1.localeCompare(key2))
  .map(([_, v]) => v);


for (var i = 0; i < arr2.length; i++) {
  test.innerHTML += arr2[i] + "<br>";

}