Chefranov
@Chefranov
Новичок

Как отфильтровать массив объектов по вхождению?

Имеется такая таблица
5eb06188c38cc650306843.png
И данная таблица в виде объектов, один объект = одна строка таблицы:
var list = [
    { "n1": 18, "n2": 1, "n3": 5, "n4": 17 },
    { "n1": 1, "n2": 2, "n3": 11, "n4": 6 },
    { "n1": 1, "n2": 5, "n3": 11, "n4": 12 },
    { "n1": 6, "n2": 17, "n3": 12, "n4": 1 },
    { "n1": 4, "n2": 7, "n3": 8, "n4": 20 },
    { "n1": 2, "n2": 3, "n3": 8, "n4": 7 },
    { "n1": 2, "n2": 8, "n3": 7, "n4": 6 },
    { "n1": 14, "n2": 15, "n3": 11, "n4": 10 },
    { "n1": 11, "n2": 8, "n3": 16, "n4": 15 },
    { "n1": 20, "n2": 4, "n3": 8, "n4": 7 },
    { "n1": 11, "n2": 12, "n3": 6, "n4": 14 },
    { "n1": 1, "n2": 5, "n3": 12, "n4": 11 },
    { "n1": 17, "n2": 12, "n3": 5, "n4": 1 },
    { "n1": 8, "n2": 9, "n3": 13, "n4": 19 },
    { "n1": 8, "n2": 9, "n3": 19, "n4": 15 },
    { "n1": 10, "n2": 9, "n3": 15, "n4": 8 },
    { "n1": 11, "n2": 12, "n3": 17, "n4": 6 },
    { "n1": 8, "n2": 7, "n3": 20, "n4": 4 }
]

Необходимо пройтись по массиву объектов и убрать повторяющиеся вхождения (4 цифры) и оставить только одно.
Например, есть строка с значениями 1,5,11,12 и есть 1,5,12,11, необходимо оставить одну строку (объект) из эти двух, порядок цифр в строке может быть разный.

Визуальный пример, конечный результат:
5eb06663cad23599564514.png
Ну и в конце просто вывести отфильтрованный массив объектов.
  • Вопрос задан
  • 159 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
«Отпечатком» строки предлагаю сделать JSON сериализацию массива отсортированных значений.
Тогда из обоих получится один хэш:
{ "n1": 1, "n2": 5, "n3": 11, "n4": 12 } => "[1,5,11,12]"
{ "n1": 1, "n2": 5, "n3": 12, "n4": 11 } => "[1,5,11,12]"

Код:
const makeHash = (obj) => JSON.stringify(Object.values(obj).sort((a, b) => a - b));
const hashes = list.map(makeHash);
const result = list.filter((el, i) => i === hashes.indexOf(makeHash(el)))
результат
[
  {
    "n1": 18,
    "n2": 1,
    "n3": 5,
    "n4": 17
  },
  {
    "n1": 1,
    "n2": 2,
    "n3": 11,
    "n4": 6
  },
  {
    "n1": 1,
    "n2": 5,
    "n3": 11,
    "n4": 12
  },
  {
    "n1": 6,
    "n2": 17,
    "n3": 12,
    "n4": 1
  },
  {
    "n1": 4,
    "n2": 7,
    "n3": 8,
    "n4": 20
  },
  {
    "n1": 2,
    "n2": 3,
    "n3": 8,
    "n4": 7
  },
  {
    "n1": 2,
    "n2": 8,
    "n3": 7,
    "n4": 6
  },
  {
    "n1": 14,
    "n2": 15,
    "n3": 11,
    "n4": 10
  },
  {
    "n1": 11,
    "n2": 8,
    "n3": 16,
    "n4": 15
  },
  {
    "n1": 11,
    "n2": 12,
    "n3": 6,
    "n4": 14
  },
  {
    "n1": 17,
    "n2": 12,
    "n3": 5,
    "n4": 1
  },
  {
    "n1": 8,
    "n2": 9,
    "n3": 13,
    "n4": 19
  },
  {
    "n1": 8,
    "n2": 9,
    "n3": 19,
    "n4": 15
  },
  {
    "n1": 10,
    "n2": 9,
    "n3": 15,
    "n4": 8
  },
  {
    "n1": 11,
    "n2": 12,
    "n3": 17,
    "n4": 6
  }
]
Ответ написан
@StockholmSyndrome
const result = list.reduce((acc, curr) => {
  const val = Object.values(curr).sort((a, b) => a - b).toString(); 
  if (!acc.values.includes(val)) {
    acc.values.push(val);
    acc.filtered.push(curr); 
  }
  
  return acc;
}, {values: [], filtered: []}).filtered;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы