Удалить все повторяющиеся вхождения массива объектов JSON - PullRequest
0 голосов
/ 13 апреля 2020
originaData = [
{id: 1, description: abc },
{id: 2, description: def }
{id: 1, description: ghi }
{id: 3, description: jkl }
{id: 2, description: mno }
{id: 4, description: pqr }
]

expected result
uniqueData = [
{id: 3, description: jkl },
{id: 4, description: pqr }
]

duplicateData = [
{id: 1, description: abc },
{id: 2, description: def },
{id: 1, description: ghi },
{id: 2, description: mno }
]

Я уже попробовал UniqBy loda sh. Но это не дает мне ожидаемых результатов, так как не удаляет все повторяющиеся вхождения.

Ответы [ 4 ]

1 голос
/ 13 апреля 2020

Вы можете группировать по id и сортировать сгруппированные данные по длинам массива.

var data = [{ id: 1, description: 'abc' }, { id: 2, description: 'def' }, { id: 1, description: 'ghi' }, { id: 3, description: 'jkl' }, { id: 2, description: 'mno' }, { id: 4, description: 'pqr' }],
    [duplicate, unique] = Object
        .values(data.reduce((r, o) => ((r[o.id] = r[o.id] || []).push(o), r), {}))
        .reduce((r, a) => (r[+(a.length === 1)].push(...a), r), [[], []]);        

console.log(unique);
console.log(duplicate);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 13 апреля 2020

Вы можете сделать это, используя фильтр и найти в ванили javascript:

originaData.filter((o, index) => originaData.find((_o, _index) => o.id === _o.id && index !== _index))

Приведенное выше даст вам дубликаты данных в вашем массиве.

Чтобы получить массив без дубликатов данных, просто используйте ! в функции logi c:

originaData.filter((o, index) => !originaData.find((_o, _index) => o.id === _o.id && index !== _index))

0 голосов
/ 13 апреля 2020

Вы можете подсчитать идентификаторы в массиве. Затем разделите ваши данные на основе количества идентификаторов.

function tally(iterable, fn = obj => obj) {
  const tally = new Map();
  for (const item of iterable) {
    const key = fn(item);
    if (!tally.has(key)) tally.set(key, 0);
    tally.set(key, tally.get(key) + 1);
  }
  return tally;
}

function partition(iterable, fn = obj => obj) {
  const truthy = [], falsy = [];
  for (const item of iterable) {
    (fn(item) ? truthy : falsy).push(item);
  }
  return [truthy, falsy];
}

const originaData = [{id:1,description:'abc'},{id:2,description:'def'},{id:1,description:'ghi'},{id:3,description:'jkl'},{id:2,description:'mno'},{id:4,description:'pqr'}];
const idCount = tally(originaData, obj => obj.id);
const [uniqueData, duplicateData] =
  partition(originaData, obj => idCount.get(obj.id) == 1);

console.log(uniqueData);
console.log(duplicateData);

Если вам нужен только один из двух (uniqueData или duplicateData), используйте filter вместо.

0 голосов
/ 13 апреля 2020

Вы можете достичь этого в ванили javascript, используя метод Array.reduce. Сначала сгруппируйте данные по идентификатору, затем разделите группы на уникальные и повторяющиеся массивы. Если в вашей группе есть только один элемент, элемент уникален или если в группе более одной записи, содержащиеся в ней записи являются дубликатами.

const originialData = [
  {id: 1, description: 'abc' },
  {id: 2, description: 'def' },
  {id: 1, description: 'ghi' },
  {id: 3, description: 'jkl' },
  {id: 2, description: 'mno' },
  {id: 4, description: 'pqr' }
]

// Group data as an object by using the Array.reduce method.
const groupedById = originialData.reduce((groups, item) => {
  // if a group has not yet been created, default to empty array.
  if (!groups[item.id]) {
    groups[item.id] = [];
  }

  // push the entry into the group
  groups[item.id].push(item);

  return groups;
}, {});

// Get the group keys
const groupKeys = Object.keys(groupedById);

// Iterate the group keys, and divide into unique and duplicates array
const [unique, duplicates] = groupKeys.reduce(([uniq, dupl], id) => {
  // Get the current group
  const group = groupedById[id];

  // Select array depending on length
  if (group.length === 1) { // if length is 1, then the item is unique
    uniq = uniq.concat(group);
  } else { // else the containing items are duplicates.
    dupl = dupl.concat(group);
  }


  return [uniq, dupl];
}, [[], []])

console.log(unique)

Рабочий пример здесь: https://jsbin.com/sijidacile/edit?js, консоль

...