Вы можете расширить jQuery, используя jQuery.fn.extend()
, и добавить настраиваемый метод, который выполняет итерацию по всем совпадающим элементам, извлекая один или несколько атрибутов из всех из них и помещает / объединяет их в возвращаемый массив / object, соответственно.
Поскольку реализация ванильная JS, это будет быстрее, чем работа с jQuery объектами и функциями на всех промежуточных этапах, но может потребоваться некоторая настройка в зависимости от того, какие браузеры вам нужно поддержка:
jQuery.fn.extend({
attrs: function(attributeName) {
if (attributeName) {
return this.toArray().map((el) => el.getAttribute(attributeName));
}
return this.toArray().reduce((merged, el) => {
const { attributes } = el;
const totalAttributes = attributes.length;
for (let i = 0; i < totalAttributes; ++i) {
const attribute = attributes[i].nodeName;
if (merged[attribute]) {
merged[attribute].push(el.getAttribute(attribute));
} else {
merged[attribute] = [el.getAttribute(attribute)];
}
}
return merged;
}, {});
},
});
console.log($('entry').attrs());
console.log($('entry').attrs('id'));
console.log($('entry').attrs('class'));
.as-console-wrapper {
max-height: 100% !important;
}
<entries>
<entry id="1" class="foo" />
<entry id="2" class="bar" />
<entry id="3" class="baz" />
<entry id="4" class="qux" />
</entries>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>