-3

I have:

<div class="parent">
  <div class="myItem">Item 1</div>
  <div class="myItem">Item 2</div>
  <div class="myItem">Item 3</div>
  <div class="myItem">Item ...</div>
  <div class="myItem">Item 10</div>
</div>

I want:

<div class="parent">
  <div class="myItem">Item 7</div>
  <div class="myItem">Item 4</div>
  <div class="myItem">Item 5</div>
  <div class="myItem">Item 9</div>
  <div class="myItem">Item 2</div>
</div>

I would like to replace a certain amount (for example 5 of 10) items. And the replaced items shuold be in a new, random order. In pure JavaScript. Whats the best way to do this?

Stefan Vogt
  • 1,513
  • 2
  • 10
  • 16

2 Answers2

1

A working solution, that doesn't need .getElementsByClassName and instead just works on the .parent element (and it's children property):

function scrambleChilds(parentEl, childCount) {
  var childs = Array.from(parentEl.children), // get all children
      random = [], // new children
      index;
      
  while (childs.length) { // while there are children...
    index = Math.floor(Math.random() * childs.length); // ... make a random index ...
    random.push(childs.splice(index, 1)[0]); // ... and save a random child into the new children
  }
  
  parentEl.innerHTML = ''; // make sure parent element is empty
  random.slice(0, childCount || Infinity).forEach(child => { // grab first N and...
    parentEl.appendChild(child); // ...append each to parent
  });
}



scrambleChilds(document.querySelector('.parent'), 5);
<div class="parent">
  <div class="myItem">Item 1</div>
  <div class="myItem">Item 2</div>
  <div class="myItem">Item 3</div>
  <div class="myItem">Item 4</div>
  <div class="myItem">Item 5</div>
  <div class="myItem">Item 6</div>
  <div class="myItem">Item 7</div>
  <div class="myItem">Item 8</div>
  <div class="myItem">Item 9</div>
  <div class="myItem">Item 10</div>
</div>
David
  • 3,552
  • 1
  • 13
  • 24
  • The Array.from( items ) returns an Array object from any object. With this you can use the array methods like push() or slice(). This helped me a lot, thanks! – Stefan Vogt Sep 01 '20 at 14:48
0

I hope this helps:

const shuffleArray = array => {
    for (let i = array.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [array[i], array[j]] = [array[j], array[i]];
    }
  
  return array;
}


const [parent] = document.getElementsByClassName('parent');
const items = [...document.getElementsByClassName('myItem')];
const shuffledArray = shuffleArray(items);

parent.innerHTML = '';
const elementsAmount = 5; 

for(let i = 0; i < elementsAmount; i++){
  parent.appendChild(shuffledArray[i]);
}
<div class="parent">
  <div class="myItem">Item 1</div>
  <div class="myItem">Item 2</div>
  <div class="myItem">Item 3</div>
  <div class="myItem">Item 4</div>
  <div class="myItem">Item 5</div>
  <div class="myItem">Item 6</div>
  <div class="myItem">Item 7</div>
  <div class="myItem">Item 8</div>
  <div class="myItem">Item 9</div>
  <div class="myItem">Item 10</div>
</div>
Daniil Emelin
  • 251
  • 1
  • 5