0

I have these animal cards in a container div, and i want to sort them alphabetically. I only want to use vanilla javascript, no jquery please.

  <div class="animal-container">
<div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">Giraffe</div>
  </div>
</div>
    <div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">Camel</div>
  </div>
</div>
    <div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">Dog</div>
  </div>
</div>
    <div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">Lion</div>
  </div>
</div>
2
  • Please also show the javascript code that you tried! You can start with getElementsByclassname() or querySelector() Commented Jul 21, 2021 at 11:10
  • You may use an array to store the animals' data and sort the array and append the DOM from the array object. Commented Jul 21, 2021 at 12:00

3 Answers 3

1

Here's what I came up with. I selected all tags with the class "animal-name". Then stored their textContent in an Array, sorted it then replaced it in the original tags

let animals = document.querySelectorAll('.animal-name');

let animalNames = [];
for(let i=0; i<animals.length; i++){
    animalNames.push(animals[i].textContent)
}

animalNames = animalNames.sort();

for(let i=0; i<animals.length; i++){
    animals[i].textContent = animalNames[i];
}
<div class="animal-container">
<div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">Giraffe</div>
  </div>
</div>
    <div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">Camel</div>
  </div>
</div>
    <div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">Dog</div>
  </div>
</div>
    <div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">Lion</div>
  </div>
</div>

Sign up to request clarification or add additional context in comments.

Comments

0

The idea is to sort the DOM elements, and then append them in that order again inside the container element: this will actually move these elements in their right order:

const container = document.querySelector(".animal-container");
const key = (a) => a.querySelector(".animal-name").textContent.trim();

Array.from(container.children)
     .sort((a, b) => key(a).localeCompare(key(b)))
     .forEach(child => container.appendChild(child));
<div class="animal-container">
  <div class="animal-cards">
    <div class="img-container">
      <img src="#">
    </div>
    <div class="animal-info">
      <div class="animal-name">Giraffe</div>
    </div>
  </div>
  <div class="animal-cards">
    <div class="img-container">
      <img src="#">
    </div>
    <div class="animal-info">
      <div class="animal-name">Camel</div>
    </div>
  </div>
  <div class="animal-cards">
    <div class="img-container">
      <img src="#">
    </div>
    <div class="animal-info">
      <div class="animal-name">Dog</div>
    </div>
  </div>
  <div class="animal-cards">
    <div class="img-container">
      <img src="#">
    </div>
    <div class="animal-info">
      <div class="animal-name">Lion</div>
    </div>
  </div>
</div>

Comments

0

You can do this by appending the elements to the DOM dynamically using JS.

For example,

const arr = ["Giraffe", "Camel", "Dog", "Lion"].sort()
arr.forEach((word) => {
     document.getElementById("animal-container").appendChild(
    <div class="animal-cards">
  <div class="img-container">
    <img src="#">
  </div>
  <div class="animal-info">
    <div class="animal-name">{word}</div>
  </div>
    
)})

1 Comment

append should be appendChild instead

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.