-1

I have the following markup:

<ul class="category-item-container">
    <li class="category-item" data-group="bottoms">Jeans</li>
    <li class="category-item" data-group="tops">Shirt</li>
    <li class="category-item" data-group="tops">Hoodie</li>
    <li class="category-item" data-group="bottoms">shorts</li>
    <li class="category-item" data-group="accesories">Hat</li>
    <li class="category-item" data-group="accesories">Hanger</li>
    <li class="category-item" data-group="bottoms">Boxer</li>
    <li class="category-item" data-group="accesories">Tørklæde</li>
    <li class="category-item" data-group="accesories">Solbriller</li>
    <li class="category-item" data-group="bottoms">Bukser</li>
    <li class="category-item" data-group="tops">T-shirt</li>
</ul>

I would like to find the unique number of data-group data-attributes. In this case the number would be 3. I was thinking to turn the list into an array and then loop over the data-group, but I am not sure how that could be done, and if it is the correct way to do it.

Mikkel Fennefoss
  • 857
  • 1
  • 9
  • 32
  • Possible duplicate of [Count unique elements in array without sorting](https://stackoverflow.com/questions/15052702/count-unique-elements-in-array-without-sorting) – Lelio Faieta Jul 20 '18 at 10:25

3 Answers3

4

Loop over the elements and add the values of data-group to a set. At the end, check the size of the set.

var set = new Set();

document.querySelectorAll('.category-item-container > .category-item').forEach(item => {
  set.add(item.getAttribute('data-group'));
});

console.log(set.size);
<ul class="category-item-container">
  <li class="category-item" data-group="bottoms">Jeans</li>
  <li class="category-item" data-group="tops">Shirt</li>
  <li class="category-item" data-group="tops">Hoodie</li>
  <li class="category-item" data-group="bottoms">shorts</li>
  <li class="category-item" data-group="accesories">Hat</li>
  <li class="category-item" data-group="accesories">Hanger</li>
  <li class="category-item" data-group="bottoms">Boxer</li>
  <li class="category-item" data-group="accesories">Tørklæde</li>
  <li class="category-item" data-group="accesories">Solbriller</li>
  <li class="category-item" data-group="bottoms">Bukser</li>
  <li class="category-item" data-group="tops">T-shirt</li>
</ul>
31piy
  • 23,323
  • 6
  • 47
  • 67
2

Use Set, Array.from and document.querySelectorAll in one line of code

const result = new Set(Array.from(document.querySelectorAll('li[data-group]'), ({dataset:{group}}) => group)).size;

console.log(`there are ${result} unique groups`);
<ul class="category-item-container">
    <li class="category-item" data-group="bottoms">Jeans</li>
    <li class="category-item" data-group="tops">Shirt</li>
    <li class="category-item" data-group="tops">Hoodie</li>
    <li class="category-item" data-group="bottoms">shorts</li>
    <li class="category-item" data-group="accesories">Hat</li>
    <li class="category-item" data-group="accesories">Hanger</li>
    <li class="category-item" data-group="bottoms">Boxer</li>
    <li class="category-item" data-group="accesories">Tørklæde</li>
    <li class="category-item" data-group="accesories">Solbriller</li>
    <li class="category-item" data-group="bottoms">Bukser</li>
    <li class="category-item" data-group="tops">T-shirt</li>
</ul>
Jaromanda X
  • 53,868
  • 5
  • 73
  • 87
0

You could cycle every li and create an array of unique elements, e.g.:

var groups = [];
document.querySelectorAll("ul.category-item-container li").forEach(v => {
  var group = v.getAttribute("data-group");
  if (!groups.includes(group)) {
    groups.push(group);
  }
});
console.log(groups.length);
<ul class="category-item-container">
    <li class="category-item" data-group="bottoms">Jeans</li>
    <li class="category-item" data-group="tops">Shirt</li>
    <li class="category-item" data-group="tops">Hoodie</li>
    <li class="category-item" data-group="bottoms">shorts</li>
    <li class="category-item" data-group="accesories">Hat</li>
    <li class="category-item" data-group="accesories">Hanger</li>
    <li class="category-item" data-group="bottoms">Boxer</li>
    <li class="category-item" data-group="accesories">Tørklæde</li>
    <li class="category-item" data-group="accesories">Solbriller</li>
    <li class="category-item" data-group="bottoms">Bukser</li>
    <li class="category-item" data-group="tops">T-shirt</li>
</ul>
Alessio Cantarella
  • 5,077
  • 3
  • 27
  • 34