const AppState = {
appItems: [{
profileItem: ['1.1', '1.2', '1.3'],
},
{
profileItem: ['2.1', '2.2', '2.3'],
},
{
profileItem: ['3.1', '3.2', '3.3'],
}
]
}
// creating an HTML representation of the list
const itemHtml = (item) => {
return `<li>${ item }</li>`
}
const profileItemsHtml = (profileItems) => {
return profileItems.map(item => itemHtml(item)).join('')
}
const createList = (appItems) => {
return appItems.reduce((a, {
profileItem
}) => {
a = [...a, ...profileItem]
return a
}, [])
}
// putting out the HTML
const updateListContainer = (container, list) => {
container.innerHTML = profileItemsHtml(list)
}
// the full list
const fullList = createList(AppState.appItems)
const fullListContainer = document.getElementById('full-list')
updateListContainer(fullListContainer, fullList)
// initiating the filtered list
let filteredList1 = fullList
const filteredListContainer1 = document.getElementById('filtered-list-1')
updateListContainer(filteredListContainer1, filteredList1)
let filteredList2 = fullList
const filteredListContainer2 = document.getElementById('filtered-list-2')
updateListContainer(filteredListContainer2, filteredList2)
// setting up filtering on input field input event
const filterInput = document.getElementById('filter-input')
filterInput.addEventListener('input', function(e) {
// FILTER 1: use join()
// if the list is made up of only strings, then you
// could join them & search the whole string at once
// might yield errors in edge cases, but mostly it
// should be correct, I think
// edge case example: 22 (you can try it)
const filtered1 = AppState.appItems.find(({
profileItem
}) => profileItem.join('').includes(e.target.value))
if (filtered1 && e.target.value) {
updateListContainer(filteredListContainer1, filtered1.profileItem)
} else {
updateListContainer(filteredListContainer1, fullList)
}
// FILTER 2: use SOME
const filtered2 = AppState.appItems.find(({
profileItem
}) => profileItem.some(item => item.includes(e.target.value)))
if (filtered2 && e.target.value) {
updateListContainer(filteredListContainer2, filtered2.profileItem)
} else {
updateListContainer(filteredListContainer2, fullList)
}
})
.list-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
<div>
<label for="filter-input">
Filter:
<input type="text" id="filter-input" />
</label>
<hr>
<div class="list-container">
<div>
FULL LIST:
<ul id="full-list"></ul>
</div>
<div>
FILTERED WITH JOIN:
<ul id="filtered-list-1"></ul>
</div>
<div>
FILTERED WITH SOME:
<ul id="filtered-list-2"></ul>
</div>
</div>
</div>