for (let year in data) {
let cache = {};
data[year] = data[year].filter(e=>{
if (cache[e.number]) return false;
return cache[e.number] = true;
});
}
Точно не знаю, что для вас значит слово
"красиво". Если это значит в одну строчку, то мне кажется, что красота здесь является спорным моментом. Лично я под красотой понимаю, прежде всего,
понятный код (для тех, кто с ним не знаком). А это в первую очередь означает наличие комментариев или хотя бы осмысленное именование. И для простых примеров как-то странно эту красоту наводить.
Ну а по скорости всё зависит от алгоритма и акцента на использовании нативных функций. Выбор алгоритма, в свою очередь, зависит от многих факторов, которые в вашем вопросе не обозначены. Так что привожу просто наиболее очевидный для меня алгоритм.