@pacan4ik

Как можно оптимизировать этот код поиска совпадений в массиве?

Задача была найти совпадения и их места в массиве.
Можно ли как-то эффективно оптимизировать данный код?

let arr = [1, 2, 5, 2, 3, 2, 1, 7, 8, 5, 3, 4, 6];
function findSame(arr) {
	let obj = {};
	for(let i = 0; i < arr.length; ++i) {
		if(arr[i] in obj) {
			obj[arr[i]]['pos'].push(i);
			obj[arr[i]]['len']++;
		}
		else {
			obj[arr[i]] = {};
			obj[arr[i]]['pos'] = [];
			obj[arr[i]]['pos'].push(i);
			obj[arr[i]]['len'] = 1;
		}
	}

	for(let [key, o] of Object.entries(obj)) {
		if(o.len < 2) delete obj[key];
	}
	return obj;
}

let t = findSame(arr);
console.log(t);
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
"Оптимизировать" - в смысле сократить? Вот так можно:

const duplicates = Object.fromEntries(Object
  .entries(arr.reduce((acc, n, i) => (
    (acc[n] ??= []).push(i),
    acc
  ), {}))
  .filter(n => n[1].length > 1)
);

Если среди значений массива могут быть такие, которые, будучи различными, имеют одинаковый строковый эквивалент, то обычный объект следует заменить на Map:

const duplicates = new Map(Array
  .from(arr.reduce((acc, n, i) => (
    acc.set(n, acc.get(n) ?? []).get(n).push(i),
    acc
  ), new Map))
  .filter(n => n[1].length > 1)
);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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