<style>
.users-list {
width: 500px;
margin: 1rem;
background-color: hsl(0 0% 0% /.1);
font: 400 .75rem/1 system-ui, monospace;
}
.users-list div {
padding: .5rem;
}
.users-list div:nth-child(even) {
background-color: hsl(0 0% 0% /.1);
}
.users-list div span {
font-weight: bold;
font-size: 105%;
}
.users-list div p:last-of-type {
margin-bottom: 0;
}
</style>
<div class="users-list"></div>
<script>
const users = [
{ username: 'emma_smith', info: 'Consectetur adipiscing elit.' },
{ username: 'alex_jones', info: 'Sed 1 do eiusmod tempor incididunt.' },
{ username: 'john_doe', info: 'Lorem 1 ipsum dolor sit amet.' },
{ username: 'sarah_smith', info: 'Fusce consequat libero in sapien faucibus.' },
{ username: 'liam_brown', info: 'Ut enim ad minim veniam.' },
{ username: 'olivia_taylor', info: 'Ut labore et dolore magna aliqua.' },
{ username: 'david_jackson', info: 'Nulla hendrerit lectus sed metus scelerisque.' },
{ username: 'john_doe', info: 'Lorem 2 ipsum dolor sit amet.' },
{ username: 'michael_adams', info: 'Vivamus venenatis mauris at libero.' },
{ username: 'alex_jones', info: 'Sed 2 do eiusmod tempor incididunt.' },
{ username: 'kate_smith', info: 'Integer tristique tortor vel nisi dapibus, nec fringilla eros faucibus.' },
{ username: 'alex_jones', info: 'Sed 3 do eiusmod tempor incididunt.' },
{ username: 'sarah_smith', info: 'Pellentesque nec est in quam vestibulum vehicula vel eget purus.' },
{ username: 'kate_smith', info: '' }, // empty
{ username: 'alex_jones', info: 'Suspendisse potenti. In hac habitasse platea dictumst.' },
{ username: 'kate_smith', info: 'Maecenas convallis mi eu urna viverra dignissim.' }
];
const users_merged_info = {};
for (const user of users) {
if (! users_merged_info[user.username])
users_merged_info[user.username] = [];
users_merged_info[user.username].push(user.info);
}
window.onload = populateUserList;
function populateUserList() {
const list = document.querySelector('.users-list');
const fragment = document.createDocumentFragment();
for (const username in users_merged_info) {
const div = document.createElement('DIV');
if (users_merged_info.hasOwnProperty(username)) {
div.innerHTML += `<span>${username}</span>`;
for (const info of users_merged_info[username])
div.innerHTML += `<p>${info}</p>`;
}
fragment.appendChild(div);
}
list.appendChild(fragment);
}
</script>