Как я могу отсортировать ключи хеша естественно?

Здесь мы снова встречаемся:)

document.getElementById("pButton").addEventListener("click", () => {
  let max = document.querySelectorAll("p").length - 1;
  let min = 0;
  let x1 = Math.round((Math.random() * (max - min)) + min);
  let x2 = Math.round((Math.random() * (max - min)) + min);
  while (x1 === x2) {
    x2 = Math.round((Math.random() * (max - min)) + min);
  }
  
  let tmp1 = document.querySelectorAll("p")[x1];
  let tmp2 = document.querySelectorAll("p")[x2];
  
  // it is nice to get direct reference, don't you think?
  let parentDiv = document.getElementById('parent');

  // get the previous element of first element you need to change
  let tmp1PrevEle = tmp1.nextElementSibling;
  // this is for the second one
  let tmp2PrevEle = tmp2.nextElementSibling;
  // insert both based on the previous and next elements
  parentDiv.insertBefore(tmp2, tmp1PrevEle);
  parentDiv.insertBefore(tmp1, tmp2PrevEle);
});
<div id="parent">
  <h1>List</h1>
  <p>p1</p>
  <ol>
    <li>first</li>
    <li>second</li>
  </ol>
  <a>example</a>
  <p>p2</p>
  <ol>
    <li>first</li>
    <li>second</li>
    <li>third</li>
  </ol>
  <a>example</a>
  <!-- just to see the randomness, I've added two more elements -->
  <p>p3</p>
  <ol>
    <li>first</li>
    <li>second</li>
    <li>third</li>
  </ol>
  <a>example</a>
  <p>p4</p>
  <ol>
    <li>first</li>
    <li>second</li>
    <li>third</li>
  </ol>
  <a>example</a>
</div>
<button id="pButton">BUTTON</button>

Что я здесь сделал,

  1. Получите следующий элемент из nextElementSibling и затем запустите вставку элемента, который вам нужно сдвинуть.
  2. Я копирую nextElementSibling обоих узлов, чтобы они не могли измениться в будущем.

Ваша проблема здесь.

let tmp1Index = 0;
  for (let a of tmp1parent.childNodes) {
    if (a === tmp1) {
      break;
    }
    tmp1Index += 1;
  }

этот индекс ненадежен, так как после того, как элементы были изменены, это может повлиять на исходную позицию nodelist.

14
задан brian d foy 20 December 2008 в 18:18
поделиться

2 ответа

foreach my $key (sort { $a <=> $b} keys %hash) {
    print $hash{$key} . "\n";
}

Операция вида берет дополнительное сравнение "подпрограмма" (или как блок кода, поскольку я сделал здесь, или название подпрограммы). Я предоставил встроенное сравнение, которое рассматривает ключи как числа с помощью встроенного числового оператора сравнения' <=>'.

39
ответ дан 1 December 2019 в 06:00
поделиться

Ответ Paul корректен для чисел, но если Вы хотите взять его, шаг вперед и вид смешали слова, и числа как человек были бы, ни один cmp ни <=> сделаю. Например...

  9x
  14
  foo
  fooa
  foolio
  Foolio
  foo12
  foo12a
  Foo12a
  foo12z
  foo13a

Вид:: Естественно заботится об этой проблеме, обеспечивающей nsort и ncmp стандартные программы.

18
ответ дан 1 December 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: