@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);
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
"Оптимизировать" - в смысле сократить? Вот так можно:

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

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

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

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

Похожие вопросы
28 нояб. 2024, в 21:25
5000 руб./за проект
28 нояб. 2024, в 18:46
3000 руб./за проект
28 нояб. 2024, в 17:46
10000 руб./за проект