То, как вы кодируете, действительно трудоемко ..
, чтобы упростить код, я использовал набор данных, чтобы сохранить первую букву непосредственно на элементе для отображения или скрытия. Я также добавил noDisplaySub
класс. для поиска / отображения задания
https://developer.mozilla.org/en-US/docs/Web/API/HTMLOrForeignElement/dataset
const DomParser = new DOMParser()
, ctx_List = document.getElementById('contact_list')
, inSearch = document.getElementById('address_search_input')
;
function createSection(firstChar)
{
let section=
`<div class="rowSectionAddress" data-char1="${firstChar}">
<span class="address_name_table">${firstChar}</span>
</div>`;
return DomParser.parseFromString( section, 'text/html').body.firstChild ;
}
function createRows(arrData)
{
let row =
`<div class="rowDataAddress">
<span class="address_name_table">${arrData[1]} ${arrData[2]}</span>
</div>`;
return DomParser.parseFromString( row, 'text/html').body.firstChild ;
}
function process_address_data(address_data)
{
let initial_char = null
, ref_section = null
;
for (let address of address_data)
{
let first_char = address[1].charAt(0).toUpperCase()
if (initial_char != first_char)
{
initial_char = first_char
ref_section = createSection(first_char)
ctx_List.appendChild(ref_section)
}
ref_section.appendChild( createRows(address) )
}
}
var inSearch_key = '*' // current address_search_input value
;
inSearch.oninput=e=>
{
let SearchLetter = inSearch.value.toUpperCase();
SearchLetter = (SearchLetter.length > 0) ? SearchLetter.charAt(0) : '*'
if (inSearch_key!== SearchLetter )
{
inSearch_key = SearchLetter
ctx_List.querySelectorAll('.rowSectionAddress').forEach(section=>
{
if (inSearch_key===section.dataset.char1
|| inSearch_key==='*' )
{ section.classList.remove('noDisplaySub') }
else
{ section.classList.add('noDisplaySub') }
}) } }
// --------------- test part --------------------------
const address_data
= [ [ '', 'abc 1', 'abc 2' ]
, [ '', 'bcd x', 'bcd y' ]
, [ '', 'bcd w', 'bcd z' ]
, [ '', 'ecd m', 'ecd n' ]
, [ '', 'ecd v', 'ecd n' ]
, [ '', 'ecd w', 'ecd n' ]
]
process_address_data(address_data)
.noDisplaySub > div { display: none; }
<div class="address_book_wrapper">
<div class="address_top_wrapper"></div>
<div class="address_center_wrapper">
</div>
<div class="contact_list_wrapper">
<!-- search input fiels -->
<input id="address_search_input" type="text" placeholder="type '*' for All (or a,b,e) "/>
<div id="contact_list"></div>
</div>
<div class="address_bottom_wrapper"></div>
</div>