@Adven0104

Исключить повторяющиеся объекты?

Имеется массив документов:

let docs = [
    {index:0, type: 'Word', date: '24.06'},  {index:1, type: 'Word', date: '24.06'}, 
    {index:2, type: 'Word', date: '25.06'},  {index:3, type: 'Word', date: '26.06'},
    {index:4, type: 'Excel', date: '24.06'},  {index:5, type: 'Excel', date: '24.06'}, 
    {index:6, type: 'Excel', date: '25.06'}, {index:7, type: 'Excel', date: '26.06'},
    {index:8, type: 'Another', date: '24.06'},  {index:9, type: 'Another', date: '24.06'}, 
    {index:10, type: 'Another', date: '26.06'},  {index:11, type: 'Another', date: '26.06'},
]


Нужно получить:

[
    {type: "Word", date: "24.06"}, {type: "Word", date: "26.06"}, 
    {type: "Word", date: "27.06"}, {type: "Excel", date: "24.06"}, 
    {type: "Excel", date: "25.06"}, {type: "Another", date: "24.06"}, 
    {type: "Another", date: "26.06"}
]


Можно ли найти способ реализации при помощи нативного JS?
Я пытался сделать это при помощи new Set(), но таким способом находил решение только для одного свойства:

let unique = doсs.reduce((acc, elem) => {
    return acc.add(elem.type);
}, new Set())
let createdObject = Array.from(unique).map((elem, index) => {
    let arr = {type: elem, date: elem}
    return arr
})
return createdObject


Спасибо за просмотр вопроса!
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const uniqueDocs = docs
  .filter((n, i, a) => n === a.find(m => m.date === n.date && m.type === n.type))
  .map(({ type, date }) => ({ type, date }));

или

const uniqueDocs = Object
  .entries(docs.reduce((acc, n) => ((acc[n.type] = acc[n.type] || new Set).add(n.date), acc), {}))
  .reduce((acc, n) => (acc.push(...Array.from(n[1], m => ({ type: n[0], date: m }))), acc), []);

или

const unique = (arr, keys) =>
  arr.filter((n, i, a) => i === a.findIndex(m => keys.every(k => n[k] === m[k])));

const pick = (obj, keys) =>
  keys.reduce((acc, k) => (acc[k] = obj[k], acc), {});


const keys = [ 'type', 'date' ];
const uniqueDocs = unique(docs, keys).map(n => pick(n, keys));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 12:16
60000 руб./за проект
23 нояб. 2024, в 09:59
2000 руб./в час
23 нояб. 2024, в 08:36
2000 руб./за проект