Есть массив объектов типа:
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 задачи:
- Нужно найти все одинаковые значения “page” и изменить “duplicate” на true, то есть у объектов с ID = 3, 4, 6 и 7, значения ключа “duplicate” сделать равным true.
- Создать новый массив со списком 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
Алгоритм можно реализовать с помощью цикла:
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 и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
В одной из предыдущих статей мы рассмотрели вопрос: “Как быстро удалить дубликаты в списке?“. В этом материале я расскажу о трех способах поиска дубликатов в списке.
Первый способ (сортировка):
Выделяем наш список, в котором необходимо найти повторяющиеся значения, переходим во вкладку меню “Данные”, в разделе “Сортировка и фильтр” нажимаем кнопку “Сортировка по убыванию” или “Сортировка по возрастанию”:
Наш список будет отсортирован и в нем визуально будет проще найти повторяющиеся значения:
Второй способ (условное форматирование):
Выделяем наш список, в котором необходимо найти повторяющиеся значения, переходим во вкладку меню “Главная”, в разделе “Стили” нажимаем “Условное форматирование” в выпавшем списке выбираем пункт “Правила выделения ячеек”, в списке вариантов выбираем “Повторяющиеся значения…”:
В открывшемся диалоговом окне нажимаем “ОК”:
Все повторяющиеся значения в списке будут выделены цветом:
Третий способ (сводная таблица):
Выделяем наш список, в котором необходимо найти повторяющиеся значения, переходим во вкладку меню “Вставка”, в разделе “Таблицы” нажимаем кнопку “Сводная таблица”:
В открывшемся диалоговом окне нажимаем “ОК”:
Перетаскиваем поле со списком (в моем случае это “Фамилия”) в “СТРОКИ” и в “ЗНАЧЕНИЯ”:
Встаем в первую ячейку с данными сводной таблицы, переходи во вкладку меню “Данные”, в разделе “Сортировка и фильтр” нажимаем кнопку “Сортировка по убыванию”:
В верхней части сводной таблицы получаем все повторяющиеся данные с количеством повторов:
Первый и второй варианты безусловно быстрее, но они больше подходят для небольших списков. Если список очень большой и вам важно узнать сколько раз повторяются те или иные данные лучше воспользоваться третьим способом.