@Levin1994

Как избежать двойного цикла и оптимизировать?

const func = (arr, parametres) => {
        for (let i = 0; i < parametres.length; i++) {
            let founded = false;
            for (let j = 0; j < arr.length; j++) {
                if (
                    arr[j].property1 === parametres[i].property1 &&
                    arr[j].property2 === parametres[i].property2
                ) {
                    founded = true;
                }
            }
            if (parametres[i].type === 'type1') {
                if (founded) {
                    return false;
                }
            }
            if (parametres[i].type === 'type2') {
                if (!founded) {
                    return false;
                }
            }
        }
        return true;
    };
  • Вопрос задан
  • 176 просмотров
Пригласить эксперта
Ответы на вопрос 3
AngReload
@AngReload
Кратко о себе
function func(arr, parametres) {
	for (let i = 0; i < parametres.length; i++) {
		const param = parametres[i];

		let condition;
		if (param.type === 'type1') {
			condition = true;
		} else if (param.type === 'type2') {
			condition = false;
		} else {
			// может ли быть 'type3' или что-то такое, тогда пропускаем этот шаг
			continue;
		}

		// судя по телу второго цикла
		// при каждой итерации founded переписывается
		// значит в результате происходит сравнение только последней пары
		// и цикл можно убрать
		if (
			(
				arr[arr.length - 1].property1 === param.property1 &&
				arr[arr.length - 1].property2 === param.property2
			) === condition
		) {
			return false;
		}

		// но скорее всего это была бага, и цикл нужно переписать так
		for (let j = 0; j < arr.length; j++) {
			if (
				(
					arr[j].property1 === param.property1 &&
					arr[j].property2 === param.property2
				) === condition
			) {
				// при первом же совпадении функция будет завершена
				// без бесполезных проходов по оставшимся элементам
				return false;
			}
		}
	}
	return true;
};
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Двойного цикла не избежать, т.к. каждый сравнивается с каждым.
Из оптимизаций нужен break; сразу после founded = true; и для скорости можно закэшировать текущие элементы arr[j] и params[i] для чуть более быстрого обращения к ним в цикле:
_arr = arr[j];
  // ...
  _param = parametres[i];
 if( _arr.p1 === _param.p1 && _arr.p2 === _param.p2) { ...
Ответ написан
@Levin1994 Автор вопроса
А в функциональном стиле как-нибудь переписать?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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