Как найти одинаковые объекты

Есть массив объектов типа:

let data = [
    { id: 1, page: 1, duplicate: false },
    { id: 2, page: 2, duplicate: false },
    { id: 3, page: 3, duplicate: false },
    { id: 4, page: 3, duplicate: false },
    { id: 5, page: 4, duplicate: false },
    { id: 6, page: 5, duplicate: false },
    { id: 7, page: 5, duplicate: false },
    { id: 8, page: 6, duplicate: false }]

Не могу решить 2 задачи:

  1. Нужно найти все одинаковые значения “page” и изменить “duplicate” на true, то есть у объектов с ID = 3, 4, 6 и 7, значения ключа “duplicate” сделать равным true.
  2. Создать новый массив со списком ID имеющих дубликаты, т.е.: [3, 4, 6, 7]

В итоге получить надо два массива:

Первый (изменённый исходный):

  data = [
    { id: 1, page: 1, duplicate: false },
    { id: 2, page: 2, duplicate: false },
    { id: 3, page: 3, duplicate: true },
    { id: 4, page: 3, duplicate: true  },
    { id: 5, page: 4, duplicate: false },
    { id: 6, page: 5, duplicate: true },
    { id: 7, page: 5, duplicate: true },
    { id: 8, page: 6, duplicate: false }
  ]

Второй, новый со списком ID:

duplicateIds = [3,4,6,7]

Seems you need something like this:

var a = [{
    'id': 1,
    'name': 'jake'
}, {
    'id': 4,
    'name': 'jenny'
}, {
    'id': 9,
    'name': 'nick'
}, {
    'id': 1,
    'name': 'jake'
}];

var eq = [];

_.each(a, function (x, i) {
    var e = _.find(a, function (y, j) {
        return i !== j && _.isEqual(x, y);
    });
    if (e) {
        eq.push(x);
    }
});

console.log(eq);

http://jsfiddle.net/f0t0n/WBbs5/


UPDATE:
Custom “_.uniq” based on _.isEqual instead of === strict comparison:

var uniqEq = _.reject(eq, function(x, i) {
    return _.find(eq, function(y, j) {
        return i < j && _.isEqual(x, y);
    });
});

http://jsfiddle.net/f0t0n/hzBBA/

Для нахождения одинаковых элементов можно использовать следующий алгоритм:

  1. Находим количество вхождений (сколько раз встречается в списке) для каждого элемента
  2. Выводим только те, у которых количество вхождений больше 1

Алгоритм можно реализовать с помощью цикла:

const numbers = [4, 3, 3, 1, 15, 7, 4, 19, 19]; // исходный массив

const countItems = {}; // здесь будет храниться промежуточный результат

// получаем объект в котором ключ - это элемент массива, а значение - сколько раз встречается элемент в списке
// например так будет выглядеть этот объект после цикла:
// {1: 1, 3: 2, 4: 2, 7: 1, 15: 1, 19: 2}
// 1 встречается в тексте 1 раз, 2 встречается 2 раза, 4 встречается 2 раза и так далее
for (const item of numbers) {
  // если элемент уже был, то прибавляем 1, если нет - устанавливаем 1
  countItems[item] = countItems[item] ? countItems[item] + 1 : 1;
}

// обрабатываем ключи объекта, отфильтровываем все, что меньше 1
const result = Object.keys(countItems).filter((item) => countItems[item] > 1);
console.dir(result); // => ['3', '4', '19']

В этом посте мы обсудим, как найти все дубликаты в массиве в JavaScript.

1. Использование Array.prototype.indexOf() функция

Идея состоит в том, чтобы сравнить индекс всех элементов в массиве с индексом их первого появления. Если оба индекса не совпадают ни для одного элемента в массиве, можно сказать, что текущий элемент дублируется. Чтобы вернуть новый массив с дубликатами, используйте filter() метод.

В следующем примере кода показано, как реализовать это с помощью indexOf() метод:

const arr = [ 5, 3, 4, 2, 3, 7, 5, 6 ];

const findDuplicates = arr => arr.filter((item, index) => arr.indexOf(item) !== index)

const duplicates = findDuplicates(arr);

console.log(duplicates);

/*

    результат: [ 3, 5 ]

*/

Скачать  Выполнить код

 
Приведенное выше решение может привести к дублированию значений на выходе. Чтобы справиться с этим, вы можете преобразовать результат в Set, в котором хранятся уникальные значения.

function findDuplicates(arr) {

    const filtered = arr.filter((item, index) => arr.indexOf(item) !== index);

    return [...new Set(filtered)]

}

const arr = [ 5, 3, 4, 2, 3, 7, 5, 6 ];

const duplicates = findDuplicates(arr);

console.log(duplicates);

/*

    результат: [ 3, 5 ]

*/

Скачать  Выполнить код

2. Использование Set.prototype.has() функция

Кроме того, для повышения производительности вы можете использовать ES6. Установить структуру данных для эффективной фильтрации массива.

Следующее решение находит и возвращает дубликаты, используя has() метод. Это работает, потому что каждое значение в наборе должно быть уникальным.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

function findDuplicates(arr) {

    const distinct = new Set(arr);        // для повышения производительности

    const filtered = arr.filter(item => {

        // удаляем элемент из набора при первой же встрече

        if (distinct.has(item)) {

            distinct.delete(item);

        }

        // возвращаем элемент при последующих встречах

        else {

            return item;

        }

    });

    return [...new Set(filtered)]

}

const arr = [ 5, 3, 4, 2, 3, 7, 5, 6 ];

const duplicates = findDuplicates(arr);

console.log(duplicates);

/*

    результат: [ 3, 5 ]

*/

Скачать  Выполнить код

Это все о поиске всех дубликатов в массиве в JavaScript.

Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂

В одной из предыдущих статей мы рассмотрели вопрос: “Как быстро удалить дубликаты в списке?“. В этом материале я расскажу о трех способах поиска дубликатов в списке.

Первый способ (сортировка):

Выделяем наш список, в котором необходимо найти повторяющиеся значения, переходим во вкладку меню “Данные”, в разделе “Сортировка и фильтр” нажимаем кнопку “Сортировка по убыванию” или “Сортировка по возрастанию”:

kak-bystro-najti-dublikaty-v-spiske_9.png

Наш список будет отсортирован и в нем визуально будет проще найти повторяющиеся значения:

kak-bystro-najti-dublikaty-v-spiske_10.png

Второй способ (условное форматирование):

Выделяем наш список, в котором необходимо найти повторяющиеся значения, переходим во вкладку меню “Главная”, в разделе “Стили” нажимаем “Условное форматирование” в выпавшем списке выбираем пункт “Правила выделения ячеек”, в списке вариантов выбираем “Повторяющиеся значения…”:

Как быстро найти дубликаты в списке?

В открывшемся диалоговом окне нажимаем “ОК”:

kak-bystro-najti-dublikaty-v-spiske_2.png

Все повторяющиеся значения в списке будут выделены цветом:

kak-bystro-najti-dublikaty-v-spiske_3.png

Третий способ (сводная таблица):

Выделяем наш список, в котором необходимо найти повторяющиеся значения, переходим во вкладку меню “Вставка”, в разделе “Таблицы” нажимаем кнопку “Сводная таблица”:

kak-bystro-najti-dublikaty-v-spiske_4.png

В открывшемся диалоговом окне нажимаем “ОК”:

kak-bystro-najti-dublikaty-v-spiske_5.png

Перетаскиваем поле со списком (в моем случае это “Фамилия”) в “СТРОКИ” и в “ЗНАЧЕНИЯ”: 

kak-bystro-najti-dublikaty-v-spiske_6.png

Встаем в первую ячейку с данными сводной таблицы, переходи во вкладку меню “Данные”, в разделе “Сортировка и фильтр” нажимаем кнопку “Сортировка по убыванию”:

kak-bystro-najti-dublikaty-v-spiske_7.png

В верхней части сводной таблицы получаем все повторяющиеся данные с количеством повторов:

kak-bystro-najti-dublikaty-v-spiske_8.png

Первый и второй варианты безусловно быстрее, но они больше подходят для небольших списков. Если список очень большой и вам важно узнать сколько раз повторяются те или иные данные лучше воспользоваться третьим способом.

Добавить комментарий

Добавить комментарий