О каких индексе, классе и data-атрибуте идёт речь:
const index = вам виднее, что тут должно быть;
const className = 'header';
const selector = `.${className}`;
const key = 'id';
const attr = `data-${key}`;
Если у элементов общий родитель (
const parentSelector = 'table tbody';
):
const $elements = $(parentSelector).children();
const $el = $elements.eq(Math.min(index, $elements.length - 1));
const val = ($el.is(selector) ? $el : $el.prev(selector)).attr(attr) ?? null;
// или
const elements = document.querySelector(parentSelector).children;
let val = null;
for (let i = Math.min(index, ~-elements.length); i >= 0; i--) {
if (elements[i].matches(selector)) {
val = elements[i].getAttribute(attr);
break;
}
}
Если родители элементов (
const elementsSelector = 'table tr';
) разные (конкретно в вашем случае это могла бы быть таблица с несколькими
tbody
):
const val = $(elementsSelector)
.slice(0, index + 1)
.filter(selector)
.last()
.data(key) ?? null;
// или (UPD. На момент публикации вопроса метод findLast отсутствовал,
// вместо него использовалась связка из reverse-find)
const { [key]: val = null } = Array
.from(document.querySelectorAll(elementsSelector))
.slice(0, -~index)
.findLast(n => n.classList.contains(className))
?.dataset ?? {};