Вот вспомогательная функция, которая преобразует массив, подобный объекту, в реальный массив, а затем перебирает итерацию, передавая каждое значение в списке функции обратного вызова:
var each = function(iterable, callback) {
iterable = Array.prototype.concat.apply([], iterable);
for(var i = 0; i < iterable.length; i++) {
callback.apply(iterable[i], [iterable[i], i]);
}
return iterable;
};
Здесь я используювышеупомянутая вспомогательная функция для обхода массивов:
var found = [];
each(arguments, function(argument) {
each(argument.split(","), function(selector) {
each(handle(selector), function(element) {
if(found.indexOf(element) < 0) {
found.push(element);
}
});
});
});
Первый цикл проходит через аргументы.Второй цикл разделяет селекторы, а третий цикл проходит через запрошенные элементы и добавляет их в массив found
(если они еще не были добавлены).
ПРИМЕЧАНИЕ :handle
функция берет селектор (строку) и возвращает список элементов, используя document.querySelectorAll
.
Этот скрипт работает, но проблемы читаемости и производительности.
Проблемы с производительностью возникают, когда естьЕсть много аргументов, которые содержат несколько (~ 5-10) разделенных запятыми селекторов, которые затем индивидуально обрабатываются функцией handle
.
Я исправил это, используя классы вместо идентификаторов.
Затемвозникает проблема читабельности, которую я попытался исправить, переместив второй цикл за пределы родительского цикла, но это потребовало создания большего количества переменных, и единственное отличие, которое он сделал, было изменение , где цикл each
был, что ухудшило читабельность, учитывая, что для чтения было больше кода.
Вопрос : Как я могу реорганизовать мой cОда уменьшить количество вложенных циклов?
Кроме того, необходимо ли иметь первый цикл?Если я не использую его, как я буду перебирать аргументы, чтобы разделить их, чтобы получить каждый отдельный селектор?Я знаю, что метод split
предназначен для типа String
и не может быть вызван для массивов.
ПРИМЕЧАНИЕ : я использую ванильный JavaScript, не включая библиотеки и фреймворкиили внешние скрипты.